В R есть опция для управления отображением цифр. Например:
options(digits=10)
Предполагается, что до конца R-сессии будет выдавать 10-значные результаты вычислений. В файле справки R определение параметра digits выглядит следующим образом:
digits: контролирует количество цифр для печати при печати числовых значений. Это всего лишь предложение. Допустимые значения: 1 ... 22, по умолчанию 7.
Итак, здесь говорится, что это только предложение. Что, если мне нравится всегда отображать 10 цифр, не больше и не меньше?
Мой второй вопрос: что, если мне нравится отображать более 22 цифр, то есть для более точных вычислений, например, 100 цифр? Возможно ли это с базовым R, или мне нужен дополнительный пакет / функция для этого?
Изменить: благодаря предложению jmoy я попробовал, sprintf("%.100f",pi)
и он дал
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
в котором 48 знаков после запятой. Это максимальный предел, с которым R может справиться?
python -c "import math; print(format(math.pi, '.100f'))"
. Результат -pi
48 «реальных» десятичных знаков, заполненных нулями для оставшихся 52 цифр.Ответы:
Причина, по которой это всего лишь предположение, заключается в том, что вы можете легко написать функцию печати, которая игнорирует значение параметров. Встроенные функции печати и форматирования действительно используют
options
значение по умолчанию.Что касается второго вопроса, поскольку R использует арифметику конечной точности, ваши ответы не будут точными выше 15 или 16 знаков после запятой, поэтому в целом больше не требуется. В GMP и RCDD пакеты дело с несколькими прецизионного арифметике (через interace в библиотеку ГМП), но это в основном связано с большими целыми числами , а не более десятичных знаков для ваших двойников.
Mathematica или Maple позволят вам указать столько десятичных знаков, сколько душе угодно.
РЕДАКТИРОВАТЬ:
Было бы полезно подумать о разнице между десятичными знаками и значащими цифрами. Если вы проводите статистические тесты, основанные на различиях, превышающих 15-ю значащую цифру, то ваш анализ почти наверняка бесполезен.
С другой стороны, если вы имеете дело с очень маленькими числами, это не проблема, поскольку R может обрабатывать такие маленькие числа
.Machine$double.xmin
(обычно 2e-308).Сравните эти два анализа.
В первом случае различия между числами возникают только после многих значащих цифр, поэтому данные «почти постоянны». Во втором случае, хотя размер различий между числами одинаков, по сравнению с величиной самих чисел они велики.
Как упоминалось в e3bo, вы можете использовать числа с плавающей запятой с множественной точностью, используя
Rmpfr
пакет.Они медленнее и потребляют больше памяти, чем обычные
numeric
векторы (с двойной точностью) , но могут быть полезны, если у вас есть плохо обусловленная проблема или нестабильный алгоритм.источник
Если вы сами производите весь вывод, вы можете использовать
sprintf()
, например,указывает, что вы хотите отформатировать число с плавающей запятой с десятью десятичными точками (в случае
%.10f
сf
плавающей запятой, а.10
указывает десять десятичных точек).Я не знаю ни одного способа заставить функции более высокого уровня R печатать точное количество цифр.
Отображение 100 цифр не имеет смысла, если вы печатаете обычные числа R, поскольку максимальная точность, которую вы можете получить при использовании 64-битных чисел double, составляет около 16 десятичных цифр (посмотрите на .Machine $ double.eps в вашей системе). Остальные цифры будут просто мусором.
источник
Еще одно решение, способное контролировать, сколько десятичных цифр нужно распечатать в зависимости от потребностей (если вы не хотите печатать избыточные нули)
Например, если у вас есть вектор , как
elements
и хотели бы получитьsum
от негоОчевидно, что последняя цифра
1
была усечена, идеальный результат должен быть-876.54321
, но если установлен как фиксированная десятичная опция печати, напримерsprintf("%.10f", sum(elements))
, избыточные нули генерируются как-876.5432100000
Следуя руководству здесь: печать десятичных чисел , если можно определить, сколько десятичных цифр в определенном числовом числе, как здесь
-876.54321
, необходимо напечатать 5 десятичных цифр, тогда мы можем настроить параметр дляformat
функции, как показано ниже:Мы можем изменять значение на
decimal_length
основе каждого запроса времени, чтобы удовлетворить различные требования к десятичной печати.источник