Почему `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"

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

Ответы

Ответ 1

Это относится к случаю, когда показатель отрицателен.

Ответ 2

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

Ответ 3

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

Ответ 4

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