R: ошибка аппроксимации с простыми алгебраическими суммами - PullRequest
0 голосов
/ 04 ноября 2018

У меня была явная ошибка в скрипте. Через несколько часов я обнаружил, что это проблема десятичных приближений.

Чтобы сделать проблему воспроизводимой, учтите следующее:

0.02 - 0.000904686260609299 - 0.005   ==  
                                  0.02 + (-0.000904686260609299 - 0.005)
#[1] FALSE

Где:

print(0.02 -0.000904686260609299 -0.005, 22)
print(0.02 + (-0.000904686260609299 -0.005), 22)
#[1] 0.01409531373939069964774
#[1] 0.01409531373939070138246

Представьте себе ситуацию, когда у вас длинные векторы a,b,c:

a -b -c  ==  a + (-b -c)

Разница может быть статистически значимой.

Могу ли я повысить уровень внутренней аппроксимации, чтобы тест, приведенный выше, дал результат TRUE?

Если мне придется выбирать, какой результат является наилучшим приближением: a -b -c или a + (-b -c)?

1 Ответ

0 голосов
/ 04 ноября 2018

Чтобы дать ответ на первый вопрос (можно ли повысить точность с плавающей запятой?): Пакет gmp обеспечивает поддержку арифметики произвольной точности.

install.packages("gmp", dependencies=TRUE)  # didn't see any dependencies
library(gmp)
z <- as.bigq(- 0.000904686260609299)  # make smallest value a big-rational
 0.02 +z -0.005 == 0.02 +(z -0.005)
#[1] TRUE

Существует также пакет R Rmpfr, в котором перечислены системные требования:

Системные требования: gmp (> = 4.2.3), mpfr (> = 3.0.0)

Я установил mpfr в Ubuntu, используя:

$ sudo apt-get install libmpfr-dev libmpfr-doc libmpfr4 libmpfr4-dbg

Мне не нужно было устанавливать систему gmp, но, оглядываясь на стенограмму консоли, я вижу, что это было сделано во время установки gmp, и не заметил.

...