Управление количеством десятичных цифр в выводе на печать в R
-
21-09-2019 - |
Вопрос
В 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 в вашей системе).Остальные цифры будут просто мусором.