Получение 0 в R вместо точного результата - PullRequest
3 голосов
/ 17 марта 2020

Как получить точный результат вместо округленных?

result = ((0.61)**(10435)*(0.39)**(6565))/((0.63)**(5023)*(0.60)**(5412)*(0.37)**(2977)*(0.40)**(3588))

out:

NaN

Потому что знаменатель равен 0

Ответы [ 2 ]

6 голосов
/ 17 марта 2020

Я думаю логарифм - это мощный инструмент для экспоненциальной работы с большими степенями (см. Свойства в https://mathworld.wolfram.com/Logarithm.html)

Вы можете попытаться использовать log сначала над математическим выражением, а затем по очереди применить exp, то есть

result <- exp((10435*log(0.61)+6565*log(0.39)) - (5023*log(0.63)+5412*log(0.60)+ 2977*log(0.37)+3588*log(0.40)))

, что дает

> result
[1] 0.001219116
3 голосов
/ 17 марта 2020

R не может обработать такие большие показатели, потому что это сойдет к 0 за пределами его точности. Точность не бесконечна. Для того, что вы хотите, вам нужен пакет произвольной точности, такой как Rmpfr .

library(Rmpfr)

precision <- 120

result <- (mpfr(0.61, precision)**10435 * mpfr(0.39, precision)**6565) /
  (mpfr(0.63, precision)**5023 * mpfr(0.60, precision)**5412 * mpfr(0.37, precision)**2977 * mpfr(0.40, precision)**3588)

print(result)

Вывод:

1 'mpfr' number of precision  120   bits 
[1] 0.0012191160601483692718001967190171336975
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...