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


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

options(digits=10)

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

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

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

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

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

2 85

2 ответа:

причина, по которой это только предложение, заключается в том, что вы можете довольно легко написать функцию печати, которая игнорирует значение параметров. Встроенные функции печати и форматирования используйте 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 векторы, но может быть полезно, если у вас есть плохо обусловленная проблема или нестабильный алгоритм.

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

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

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

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

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