2014-07-20 3 views
4

누군가 나에게 다음과 같은 결과를 설명해 주실 수 있습니까? 부동 소수점 정밀도와 관련이 있다는 것을 알고 있지만 magnitue (차이 1e308)의 순서는 나를 놀라게합니다.부동 소수점 정밀도의 극한 수치 R

0 : 높은 정밀도

> 1e-324==0 
[1] TRUE 
> 1e-323==0 
[1] FALSE 

1 : 매우 unprecise

> 1 - 1e-16 == 1 
[1] FALSE 
> 1 - 1e-17 == 1 
[1] TRUE 
+1

예, 이것은 [R FAQ 7.31] (http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-thinkn-0027t-R-think-the- number- number -are-equal_003f) –

+0

특히,'options (digits = 22);를 시도하십시오. x <-1-1e-16; y <-1-1e-17 == 1; 인쇄 (y); print (x)' –

+0

@DavidArenburg 귀하가 제공하는 "중복"은 동일한 질문이라고 생각하지 않습니다. OP는 똑같이 나타낼 필요가있는 어떤 가치에 대해 놀랍지 만 0에 가깝고 1 근처에 표현 가능한 숫자의 밀도에 대해 놀란다고 말하는 것 같지 않습니다. –

답변

9

R은 IEEE 754 배정 밀도 부동 소수점 숫자를 사용합니다.

부동 소수점 숫자는 0에 가깝습니다. 이는 매우 광범위하게 (정확히 16 자릿수에 해당하는 10 진수 상당의 수치로) 계산되도록 설계된 결과입니다.

아마도 절대 균일도가 일정한 고정 소수점 시스템이 필요했을 것입니다. 실제로 고정 소수점은 낭비 적이거나 각 중간 계산의 범위를 미리주의 깊게 예측해야하며 잘못한 경우 큰 결과가 발생해야합니다.

긍정적 인 부동 소수점 숫자는 개략적으로 다음과 같이 :

 
+-+-+-+--+--+--+----+----+----+--------+--------+--------+-- 
0 

최소 양수 정상 배정 밀도 번호는 최소 지수의 힘에 2입니다. 근처에 배정 밀도 부동 소수점 숫자가 이미 상당히 넓게 퍼져 있습니다. 거리가 2 -53에서 그 이하의 숫자까지이고 거리가 2 -52이고 그 위의 숫자까지입니다. @ PascalCuoq의 대답은 당으로

+0

거의 17 자리 숫자 - '1 - 1e-17'은 17 자리의 전체 정밀도를 지원하면 '1'과 다를 것입니다. –

+0

@ PatriciaShanahan 필자는 십진수의 숫자가 어쨌든 이진 부동 소수점의 정밀도에 대한 대략적인 척도 일 뿐이고 충분히 강하지 않은 "등가"를 사용하여 끝내 었다고 전하고 싶었습니다. 나는 "about"을 추가했다. –

+1

우리가 질식하는 동안 '거의 16 자리'는 '거의 17 자리'보다 정확한 설명이됩니다. (2^53은 대략 10^15.95입니다). –

2

,에 IEEE 754 호환 플랫폼에서 R의 두 배 (예를 x86)의 FP 정밀도가 매우 16 진수 아니기 때문에 :

# Machine ULP in decimal digits... 
.Machine$double.ulp.digits * log10(2) 
-15.65... 

# Note the direct relationship between ULP digits and EPS: 
.Machine$double.ulp.digits = -52 
2.22 e-16 = .Machine$double.eps == 2^.Machine$double.ulp.digits 

는 따라서 1 - 1e-16 이미 매우 가까이 ULP로, 1 - 1e-17은 ULP를 넘어서고 FP 1.0으로 반올림됩니다.

.Machine : "Numerical Characteristics of the Machine"에 대한 R 설명서를 참조하십시오. 특히 EPS와 ULP의 차이점을 살펴보십시오.

(ULP가 정의 WRT 나 PF 번호 1. 더 큰 당신의 FP 번호가 도착, 마지막 비트의 값이 크면 클수록, 그리고 라운딩 작업이 더 많은 원유) 여기서 양 1e-에 관해서는

323은 다음과 같습니다 : 당신은 ULP를 최소한의 FP 값으로 혼동하고 있습니다.

최소 표현할 수있는 표준화 된 양의 FP 값이는

# Minimum-representable normalized positive FP value is... 
.Machine$double.xmin 
2.225..e-308 

# ...which would correspond to this base-2 exponent... 
log10(.Machine$double.xmin)/log10(2) 
-1022 
# ...or this base-10 exponent... 
.Machine$double.min.exp * log10(2) 
-307.65... 

... IEEE 754 Double-precision examples에 따라, 지수 전자 (308)이있다 그러나 우리는, 즉 비 표준화 FP 번호를 사용하는 경우 우리는 약간 작은 얻을 수 있습니다 따라서 모든 선행 가수트 비트는 0입니다. 따라서 경험적으로 발견 한대로 최소 정규 표현식의 양수 FP 값은 1e-324와 1e-323 사이입니다. 52 개의 가수가 있기 때문에 LSB의 수치는 2^51 또는 10^15입니다.35 작은 :

# Exponent of Minimum-representable UNnormalized positive FP value 
log10(.Machine$double.xmin) - (.Machine$double.digits * log10(2)) 
-323.607... 

(왜 우리가하지 경험적으로 정확히를 발견 할 수있는 IEEE-754은 내부적으로 반올림하기 전에 몇 가드 자리를 전달하기 때문에?)

표현 말한다

(주 또한 매개 변수가베이스-2 : .Machine$double.base = 2)

+0

downvoters와 모두에게 : 실제로 무엇이 잘못 됐는지에 대해 논평 해주세요. 나는 이것에 약간의 노력을 기울였다. – smci

관련 문제