2013-06-02 1 views
14

Даны два целых числа:Почему `a^b` возвращает числовое значение, когда` a` и `b` являются целыми числами?

a <- 1L 
b <- 1L 

Как я бы ожидать, сложение, вычитание или умножение их также дает целое число:

class(a + b) 
# [1] "integer" 
class(a - b) 
# [1] "integer" 
class(a * b) 
# [1] "integer" 

Но разделив их дает числовой:

class(a/b) 
# [1] "numeric" 

Я думаю, что могу понять, почему: потому что другие комбинации целых чисел (например, a <- 2L и b <- 3L) возвращают числовые, это больше общий вещь, чтобы всегда возвращать числовые.

Сейчас на экспоненциации:

class(a^b) 
# [1] "numeric" 

Это один является несколько неожиданным для меня. Может ли кто-нибудь объяснить, почему он был разработан таким образом?

+2

Я думаю, это потому, что результат может привести к 'Inf' ?? 'as.integer (Inf)' приведет к 'NA'. Пример: 2L^10000L – Arun

+1

Хотя мне нравится выбранный ответ, возможно, можно спросить, есть ли какое-то преимущество в том, что фактический код для возведения в степень создает еще один «угловой случай». Особенно если код 'R' или функция' unix' 'pow', которая может быть вызвана, использует журналы для вычисления показателей в первую очередь. –

ответ

17

Это охватывает случай, когда экспонента отрицательна.

6

Рассмотрите ^ как семейство функций, f(a)(b) = a^b. Для a=2 домен, для которого это возвращает целое число, ограничен значениями [0,62] (при условии, что 64-разрядные целые числа со знаком). Это очень небольшое подмножество действительных входов. Домен уменьшается только по мере увеличения a.

+0

интересный. Мне кажется, что мне больше нравится ответ Роба Линдона («целые числа не закрыты [математически] под' '' операцией "), но ваш разумен (« целые числа не закрываются [вычисляемо] при операции '^') - - но это становится сложным, потому что нужно начинать принимать решения на мягких/прагматических основаниях ... –

0

Простое добавление, вычитание и умножение двух целых чисел приводит к целому числу. в то время как деление или выполнение возведения в степень приводит к числу с/без десятичного числа, поэтому показано числовое значение вместо целого.

+0

, и вот что сказал уже принятый ответ ... – flodel

0

Возможно ли, что a^b было выполнено как-то вроде exp(b * log(a))?

+1

Без доказательства это замечание лучше всего оставить как комментарий imo. –

+0

Как ни странно :-) Это был мой комментарий некоторое время назад. Я должен быть более активным и заглядывать в базовый исходный код. –

 Смежные вопросы

  • Нет связанных вопросов^_^