Ответ 1
Это относится к случаю, когда показатель отрицателен.
Для двух целых чисел:
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"
Это немного сюрприз для меня. Может ли кто-нибудь объяснить, почему он был разработан таким образом?
Это относится к случаю, когда показатель отрицателен.
Рассмотрим ^
как семейство функций, f(a)(b) = a^b
. Для a=2
область, для которой это возвращает целое число, ограничена значениями [0,62] (при условии, что 64-разрядные целые числа). Это очень небольшое подмножество действительных входов. Домен уменьшается только по мере увеличения a
.
Простое добавление, вычитание и умножение двух целых чисел приводит к целому числу. в то время как деление или выполнение возведения в степень приводит к числу с/без десятичного числа, поэтому показано числовое значение вместо целого.
Возможно ли, что a^b
было реализовано как exp(b * log(a))
?