Управление количеством десятичных цифр в печати производится в R

Существует опция в R для получения контроля над дисплеем цифры. Например:

options(digits=10)

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

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

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

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

который имеет 48 десятичных чисел. Действительно ли это - максимальный предел R, может обработать?

103
задан zx8754 31 January 2019 в 08:25
поделиться

2 ответа

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

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

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

РЕДАКТИРОВАТЬ:
Было бы полезно подумать о разнице между десятичными знаками и значащими цифрами. Если вы проводите статистические тесты, основанные на различиях, превышающих 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")

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

45
ответ дан 24 November 2019 в 04:22
поделиться

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

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

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

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

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

40
ответ дан 24 November 2019 в 04:22
поделиться