2012-03-21 13 views
2
내가 C 코드를 쓰고 있어요 ++ 및 PI를 정의한

로 : 나는의 값을 인쇄 할 때부동 소수점

float result = (float) (-MathConstants::PI/2.0); 

: 내 코드에 나는 플로트 변수를 설정 그밖에

const double MathConstants::PI = atan(1.0)*4.0; 

DB0F C9 BF 리틀 엔디안을 얻는다. BF C9 0F DB 인 빅 엔디안으로 변환되었습니다.

http://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html에 따르면 -1.5707964에 해당합니다.

내가 이해할 수없는 것은 -1.5707963 대신 -1.5707964가 나오는 이유입니다. -1.5707963은 -PI/2가 -1.5707963267948966이므로 기대했던 결과입니다.

누군가가 나를 여기에서 가르 칠 수 있습니까?

+0

부동 소수점은 일반적으로 10 진수가 아닌 2 진수입니다. – Mysticial

+1

부동 소수점 값의 고유 부정확성을 몇 번해야합니까? 이것은 StackOverflow에서 죽음으로 논의되었습니다. – dreamlax

+2

@dreamlax, 사람들이 10 개의 손가락을 가지고있는 한 우리는 계속이 질문을 할 것입니다. 적어도이 것은 다른 대부분의 것과 약간 다릅니다. –

답변

4

반올림은 소수가 아닌 2 진수입니다. 결과를 십진수로 볼 때, 최종 자릿수를 반올림하기를 기대하기 때문에 잘못된 것으로 보입니다.하지만 그것이하는 일이 아닙니다. 그것은 최종 이진 비트를 반올림합니다.

제공된 링크에 PI/2에 대한 상수로 1.57079632679489661923132169163975를 입력하면 1.5707964의 올바른 출력이 제공됩니다.

는 32- 비트 표현으로 64 비트 표현을 비교해

1 .1001001000011111101101010100010001000010110100011000 
1 .10010010000111111011011 

절단 된 부분이므로 적절한 라운딩가 충돌 할 32 비트 결과를 요구 한 시작.