Почему добавление точных чисел дает неточный результат в R? - PullRequest
1 голос
/ 17 февраля 2020

Я хотел бы сложить точные числа и получить точный результат. Я знаю, что мне нужно установить желаемую длину ди git в опциях. Например:

> options(digits=20)
> x <- 42.616999999999997 + 42.405999999999999 + 42.869

Я ожидаю получить ответ с установленным уровнем точности. В приведенном выше случае:

> x
[1] 127.89199999999999591

Этот результат должным образом получен на моем персональном компьютере, но я не могу воспроизвести его на своем рабочем компьютере, который - с точно таким же кодом и в той же среде (без разницы в пакеты) - выдает следующий результат:

> x
[1] 127.892

Мне неясно, чем еще может отличаться мой персональный и рабочий компьютер. Может быть полезно знать, что мой персональный компьютер работает под управлением R версии 3.6.2, а мой рабочий компьютер работает под управлением 3.4.2 (я не могу обновить его из-за ограничений установки).

Заранее благодарим вас за ваш помощь!

1 Ответ

1 голос
/ 17 февраля 2020

В help("options") мы читаем:

цифр: управляет количеством значащих (см. Знак) цифр для печати при печати числовых значений c. Это только предложение. Допустимые значения: 1 ... 22 со значением по умолчанию 7. См. Примечание в print.default о значениях, превышающих 15.

Ваше значение больше 15, поэтому давайте проверим примечание в help("print.default") :

Большое количество цифр

Обратите внимание, что для больших значений цифр, в настоящее время для цифр> = 16, вычисление количества значащих цифр будет зависеть от внутренней платформы ( C library) реализация функции sprintf ().

Это объясняет, почему вы наблюдаете разные результаты на разных компьютерах. Действительно, в моей системе:

options(digits=20)
42.616999999999997 + 42.405999999999999 + 42.869
#[1] 127.892

Однако вы можете принудительно установить указанное c число цифр после десятичной точки, используя функцию R sprintf:

sprintf("%.17f", 42.616999999999997 + 42.405999999999999 + 42.869)
#[1] "127.89199999999999591"

Обратите внимание, что все это только о том, как печатать числа. Внутри R всегда использует двойную точность (пожалуйста, прочитайте этот пост , чтобы понять последствия).

Если вам нужны более точные результаты, вам нужно использовать числа произвольной точности, например, используя пакет R Rmpfr .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...