2013-02-12 4 views
2

포인팅 : http://csapp.cs.cmu.edu패트리어트 미사일 부동 컴퓨터 시스템에서 오류

연습 문제 2.51

에게 프로그래머의 관점 우리는 패트리어트 미사일 소프트웨어가 X =

0.00011001100110011001100(binary). 

한다고 가정으로 0.1 근사 것을 문제 2.46에서 본 대신 그들은 IEEE round-to-even 모드를 사용하여 이진 포인트의 오른쪽에 23 비트의 근사값 x '를 0.1로 결정했습니다.

A. x '의 이진 표현은 무엇입니까?

from the solution at the back of book, 
Looking at the nonterminating sequence for 1/10, we can see that the 2 bits to the right of the rounding position are 1, and so a better approximation to 1/10 would be obtained by incrementing x to get x′ = 0.00011001100110011001101, which is larger than 0.1. 

B. x '- 0.1의 십진수는 대략 무엇입니까?

The solution says it's 

We can see that x′ − 0.1 has binary representation: 0.0000000000000000000000000[1100] 
Comparing this to the binary representation of 1 , we can see that it is 2^−22 × 0.1 , which is around 2.38 x 10^-8 

(B)에 대한 나의 질문은 우리가 어떻게

x' - 0.1 == 0.0 0000 0000 0000 0000 0000 0000[1100] ? 

내 계산 (두 배 어떤 솔루션을 말한다)

답변

0

사용하여 나에게 0000 0000 0000 0000 0000 0100 0.000를 제공받을 수 있나요이다 줄리아

A.

julia> bits(0.1f0) 
"00111101110011001100110011001101" 

B. (네이티브 진수 형식이 없기 때문에) 우리는 정확하게 차이를 계산할 수는 없지만 정확히 진수를 인쇄하고, 그래서 차이가 수동으로

julia> @printf "%.40f" 0.1f0 
0.1000000014901161193847656250000000000000 

을 뺄 수 0.0000000014901161193847656250000000000000 = 1.490116119384765625e-9

0

0.1 이진 소수점 표현는 다음과 같은 질문 2.46에 근사 0.000 [1,100]

거기 차단 위치 23 이후에, 그리고 질문 2.51 이브에 라운드 n은 23 위치에서 발생합니다. 후자의 의미 : - 1) 가장 가까운 값으로 이동 - 2) 중간에 정확히 위치하면 짝수로 이동합니다. 위치 24 FF는 11001100...는 케이스 (1)의 임) 및 위치 (23) (1) 원래 값의 비트 근사화 될 때 가까운 값이다

x  = 0.0001100110011001100110011001100110011001100... 
x_246 = 0.00011001100110011001100 # cutoff 
x_251 = 0.00011001100110011001101 # round to even - as asked in A) 

차이 x' - 0.1x_251 - x

) B의 요청으로,
  • 부분 이진

    x_251: 0.00011001100110011001101 
    x:  - 0.0001100110011001100110011001100110011001100... 
    fdiff: 0.0000000000000000000000000110011001100110011... or 
    fdiff: 0.0 0000 0000 0000 0000 0000 0000[1100] 
    
    --> this answers "question for (B) is that how do we get x' - 0.1 
         == 0.0 0000 0000 0000 0000 0000 0000[1100]"        
    
  • 진수 값

    이외에도 617,451,515,
    ddiff = (1*2^-26 + 1*2^-27) + (1*2^-30 + A1*2^-31) + (...) + ... 
         =  3*2^-27   +  3*2^-31   + 3*2^-35 + ... 
         = 0.1*2^-22 = 2.384e-8 (sum of geometric serie) 
    julia> @printf "%.40f" 0.1*2.0^-22 
    0.0000000238418579101562513234889800848443 
    

: 왜 julia> @printf "%.40f" 0.1f0 이상 ddiff 소수점 차이의 차이점은 무엇입니까?

0.1000000014901161193847656250000000000000 
0.0000000238418579101562513234889800848443 

0.1f0는 IEEE 부동 소수점 값로 표현된다. 비트 (julia> bits(f0.1f0)) ("00111101110011001100110011001101")는 다음과 같은 의미를 갖는다 :

0 01111011 10011001100110011001101 
| |  | M = 1 + f 
| | E = e - Bias = 123 - 127 = -4 --> V = M*2^-4 (right shift M by 4) 
| sign 

M:   1.10011001100110011001101 
M/sh: 0.0001.10011001100110011001101 
x_shifted: 0.000110011001100110011001101 
x_251:  0.00011001100110011001101 

-> 0.1위한 시프트 근사 x_251 4 개보다 더 많은 비트를 갖는다. 차이의 십진수 값 x_shifted - x (위와 같이 계산) : 0.1 * 2^-26. 이제 두 가지 표현이 적합합니다.

julia> @printf "%.40f" 0.1*2.0^-26 
    0.0000000014901161193847657077180612553028 
    0.1000000014901161193847656250000000000000 # julia> @printf "%.40f" 0.1f0 
관련 문제