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

StackOverflow https://stackoverflow.com/questions/2287616

Вопрос

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

options(digits=10)

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

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

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

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top