Эти цифры слишком малы. Чтобы узнать минимальное значение ваш компьютер может обрабатывать попробовать:
> .Machine$double.xmin
[1] 2.225074e-308
Даст вам (от ?.Machine
)
наименьший ненулевой нормализованное число с плавающей запятой, мощность радикса, т.е. double.base^double.min.exp. Обычно 2.225074e-308.
В моем случае
> .Machine$double.base
[1] 2
> .Machine$double.min.exp
[1] -1022
На самом деле я могу вычислить полномочия до
> exp(-745)
[1] 4.940656e-324
Ходить вокруг этого вопроса вам нужно infinite precision arithmetic.
В R можно добиться того, что с использованием пакета Rmpfr
(PDF vignette)
library(Rmpfr)
# Calculate exp(-100)
> a <- mpfr(exp(-100), precBits=64)
# exp(-1000)
> a^10
1 'mpfr' number of precision 64 bits
[1] 5.07595889754945890823e-435
# exp(-6400)
> a^64
1 'mpfr' number of precision 64 bits
[1] 3.27578823787094497049e-2780
# use an array of powers
> ex <- c(10, 20, 50, 100, 500, 1000, 1e5)
> a^ex
7 'mpfr' numbers of precision 64 bits
[1] 5.07595889754945890823e-435 2.57653587296115182772e-869
[3] 3.36969414830892462745e-2172 1.13548386531474089222e-4343
[5] 1.88757769782054893243e-21715 3.56294956530952353784e-43430
[7] 1.51693678090513840149e-4342945
Обратите внимание, что Rmpfr основан на GNU MPFR и требует GNU GMP. Под Linux вам понадобится gmp
, gmp-devel
, mpfr
и mpfr-devel
, которые будут установлены в вашей системе, чтобы установить эти пакеты, не зная, как это работает под Windows.
Thnaks за ваш ответ. Если я применил его для вектора большого отрицательного значения, могу ли я это сделать или нет? – rose
@rose: Конечно, я добавил несколько примеров. Обратите внимание, что я использую положительное значение, поскольку 'a' уже определено как' exp (-100) '. Также обратите внимание, что если вы продолжите снижаться в какой-то момент, вам нужно будет увеличить точность. Возможно, вам захочется взглянуть на страницу Википедии по [с плавающей точкой] (http://en.wikipedia.org/wiki/Floating_point) – nico