2013-10-11 2 views
2

Я хотел бы узнать больше о вычислении точности в R, будет отличаться между E.g.R не делает манипуляции 1e + 20 цифр

-1128347132904321674821 < -1128347132904321674822 
-1128347132904321674821 > -1128347132904321674822 
-1128347132904321674821 == -1128347132904321674822 

Однако первые два ответа FALSE и третий TRUE

Я просто хочу знать, как включить все числа в точках

+0

Ну, вероятно, необходимо использовать большое количество арифметических пакетов, таких как Rmpfr. Я считаю, что R использует 64-битные двойники для представления этих больших целых чисел, которые дают вам около 16-17 значащих цифр. –

+0

Убедитесь, что вы тоже на 'R 3.x'. –

ответ

4

Когда вы вводите целое число, превышающее максимальный целочисленный размер (который вы можете найти, набрав .Machine$integer.max), тогда R принуждает его к двойному. Более того, есть только (чуть меньше) 2^64 уникальных двойных значений. 2^64 составляет около 1,84 * 10 19, а введенные вами цифры - порядка 10^21. Однако все 64 бита двойника не являются точными битами. Один из них - знаковый бит, а 11 из них - мантисса (то есть биты экспоненты). Таким образом, вы получаете только 52 бит точности, что означает 15 или 16 десятичных пробелов. Вы можете проверить это в R:

> for(i in 10:20) 
    cat(i,10^i == 10^i+1,"\n") 
10 FALSE 
11 FALSE 
12 FALSE 
13 FALSE 
14 FALSE 
15 FALSE 
16 TRUE 
17 TRUE 
18 TRUE 
19 TRUE 
20 TRUE 

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

> library(gmp) 
> x<-as.bigz("-1128347132904321674821") 
> y<-as.bigz("-1128347132904321674822") 
> x<y 
[1] FALSE 
> x>y 
[1] TRUE 
> x==y 
[1] FALSE 
> x==y+1 
[1] TRUE 
3

Если вам нужно много точности цифр, используйте либо gmp, либо Rmpfr (или оба :-)).

Но убедитесь, что это то, что вам нужно, в отличие от общих пределов точности вычислений с плавающей запятой.

+0

gmp делает то, что мне нужно, приветствия! Я не собираюсь выходить за рамки этого номера, поэтому я не думаю, что мне понадобится Rmpfr. Чем вы за вашу помощь! –

Смежные вопросы