2013-10-11 2 views
2

예를 들어, R의 정밀도 계산에 대해 더 자세히 알고 싶습니다. ,R은 1e + 20 디지트 조작을하지 않습니다.

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

그러나 처음 두 답변 FALSE이며, 세 번째는 난 그냥 당신이 숫자 '정확도가 많이 필요한 경우 포인트

+0

아마도 Rmpfr과 같은 대규모 산술 패키지를 사용해야 할 것입니다. 저는 R이 64 비트 복소수를 사용하여 16-17 자릿수의 유효 자릿수를 나타내는 이러한 큰 정수를 나타낼 것이라고 생각합니다. –

+0

'R 3.x '에 있는지 확인하십시오. –

답변

4

최대 정수 크기 (.Machine$integer.max을 입력하여 찾을 수 있음)보다 큰 정수를 입력하면 R은이를 2 배로 강제 변환합니다. 또한 2^64 고유 한 이중 값만 있습니다. 2^64는 약 1.84 * 10^19이고 입력 한 숫자는 10^21입니다. 그러나 이중 64 비트는 모두 정밀 비트가 아닙니다. 그 중 하나는 부호 비트이고, 11 개는 가수 (즉, 지수 비트)이다. 따라서 52 비트의 정밀도 만 얻으면 소수 또는 15 자리로 변환됩니다. 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

의 모든 수를 포함하는 방법을 알고 싶어 TRUE

입니다 gmp 또는 Rmpfr (또는 둘 다 :-))을 사용하십시오.

그러나 일반적인 부동 소수점 계산 정확도 제한과는 달리 사용자의 필요에 맞는지 확인하십시오.

+0

gmp가 내가 필요한 건, 건배! 나는이 번호를 넘어서서 의도하지 않으므로 나는 Rmpfr을 필요로하지 않을 것이라고 생각한다. 당신 도움보다! –