Управление количеством десятичных цифр в выводе на печать в R - PullRequest
98 голосов
/ 18 февраля 2010

В R есть опция для управления отображением цифр.Например:

options(digits=10)

должен давать результаты вычислений в 10 цифрах до конца R-сессии.В файле справки R параметр для цифр определен следующим образом:

цифр: управляет количеством цифр, печатаемых при печати числовых значений.Это только предложение.Допустимые значения: 1 ... 22 * ​​1008 * со значением по умолчанию 7

Таким образом, он говорит, что это только предложение.Что если мне нравится всегда отображать 10 цифр, не больше или меньше?

Мой второй вопрос: что если мне нравится отображать более 22 цифр, то есть для более точных расчетов, таких как 100 цифр?Возможно ли это с помощью базы R или мне нужен дополнительный пакет / функция для этого?

Редактировать: Благодаря предложению jmoy я попытался sprintf("%.100f",pi), и он дал

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

, который имеет 48 знаков после запятой.Это максимальный предел, который может выдержать R?

Ответы [ 2 ]

45 голосов
/ 18 февраля 2010

Причина, по которой это всего лишь предположение, заключается в том, что вы можете довольно легко написать функцию печати, которая игнорирует значение параметров. Встроенные функции печати и форматирования по умолчанию используют значение options.

Что касается второго вопроса, поскольку R использует арифметику с конечной точностью, ваши ответы не являются точными за пределами 15 или 16 десятичных знаков, поэтому, в общем, больше не требуется. Пакеты gmp и rcdd имеют дело с арифметикой с множественной точностью (через взаимодействие с библиотекой gmp), но это в основном связано с большими целыми числами, а не с десятичными разрядами для ваших двойников.

Mathematica или Клен позволит вам указать столько десятичных знаков, сколько пожелает ваше сердце.

EDIT:
Возможно, было бы полезно подумать о разнице между десятичными знаками и значащими цифрами. Если вы проводите статистические тесты, основанные на различиях, превышающих 15-ю значимую цифру, то ваш анализ почти наверняка будет бесполезным.

С другой стороны, если вы просто имеете дело с очень маленькими числами, это не проблема, поскольку R может обрабатывать числа, такие как .Machine$double.xmin (обычно 2e-308).

Сравните эти два анализа.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

В первом случае различия между числами возникают только после многих значащих цифр, поэтому данные «почти постоянны». Во втором случае, хотя размеры различий между числами одинаковы, по сравнению с величиной самих чисел они велики.


Как уже упоминалось в e3bo, вы можете использовать числа с плавающей запятой множественной точности, используя пакет Rmpfr.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

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

39 голосов
/ 18 февраля 2010

Если вы производите весь вывод самостоятельно, вы можете использовать sprintf(), например,

> sprintf("%.10f",0.25)
[1] "0.2500000000"

указывает, что вы хотите отформатировать число с плавающей запятой с десятью десятичными знаками (в %.10f f - для числа с плавающей запятой, а .10 задает десять десятичных знаков).

Я не знаю, как заставить высокоуровневые функции R печатать точное количество цифр.

Отображение 100 цифр не имеет смысла, если вы печатаете обычные числа R, поскольку наилучшая точность, которую вы можете получить, используя 64-битные двойные числа, составляет около 16 десятичных цифр (посмотрите на .Machine $ double.eps в вашей системе). Остальные цифры будут просто мусором.

...