2010-02-18 5 views
77

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

options(digits=10) 

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

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

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

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

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

+4

Только первые 15 цифр pi точны. Сравните с истинным значением http://joyofpi.com/pi.html –

+1

Вы правы. Почему в R? –

+3

См. FAQ на R http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f –

ответ

38

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

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

Mathematica или Maple позволит вам указать столько знаков после запятой, сколько пожелает ваше сердце.

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

+3

Поскольку [эта страница Rwiki] (http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic) демонстрирует [пакет Rmpfr] (http: //cran.at.r-project. org/web/packages/Rmpfr/index.html) допускает высокую точность арифметики с плавающей запятой в R. – e3bo

+0

Но может ли Rmpfr использоваться любым пакетом R для повышения его точности? Или он может использовать только функции, закодированные внутри него? – skan

+2

Я думал именно так: «Если вы делаете статистические тесты, которые полагаются на различия, выходящие за пределы 15-й значащей цифры, тогда ваш анализ почти наверняка является мусором». но я задавался вопросом, каково будет количество цифр, на которых я бы закончил, что это мусор, и я подумал, 5, но я был бы счастлив встать исправленным. – PatrickT

29

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

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

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

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

+0

На самом деле, некоторые специальные тесты хи-квадрат, которые я применял, нуждались в сотнях десятичных знаков, чтобы дать точные результаты. Также pi имеет тысячи десятичных знаков. Вот почему мне было интересно около 100 или более цифр. –

+12

pi имеет бесконечное число десятичных знаков; это не означает, что компьютер может их хранить. – Shane

+0

Я предполагаю, что это сценарий, где Mathematica превосходит R. – skan