2016-10-19 9 views
0
float_part = abs(double_n) - (int)abs((double_n)); //The target number is 28187281.525 
    cout << float_part; // The result is 0.525 
    cout << ((abs(double_n) - (int)abs((double_n))) == 0.525) ; //The result is 0 

그리고 다음 계산에서 정확한 결과로 인해 더 많은 계산을 한 후에 결과가 잘못됩니다. 제가더블 마이너스 int 때 정확한 손실이 발생합니다.

 float_part = abs(double_n) - (int)abs((double_n)); 

정확할 것이다 계산은 다음의 결과

 float_part = 0.525; 

로 변경할 경우

. 그래서이 두 개의 "0.525"는 실제로 다른 것처럼 보입니다.

누구나 무슨 일이 일어날 지 알고 있습니까?

저는 IEEE 754를 알고 있습니다. 그렇다면 왜 그 결과가 같은지, 둘 다 "0.525"가 아닌 "0.524999999999"와 같습니까?

미리 감사드립니다.

답변

1

std::cout이 똑같은 것을 인쇄했기 때문에 똑같은 값을 의미하지는 않습니다. 다른 값을 사용하여 std::setprecision을 사용해보세요. 너는 놀랄거야.

다른 정밀도로 인해 std::cout의 출력 값이 다르게 표시됩니다.

이 직접 비교하는 대신 결과와 예상 값 사이의 거리를 비교합니다. 다음과 같음 :

const double epsilon = 1e-6; 
//... 
cout << abs(float_part - 0.525) < epsilon << '\n'; 
+0

WOW! 방금 네가 옳은지 테스트 했어. 나는이 기이 한 방법으로 가치가있는 것을 알지 못했습니다. 계산이 float 또는 double을 포함하는 한 결과는 예상대로 결과가 보장되지 않습니다. –

+1

@ 彭浩翔 - "예상대로 결과가 나올 수 없습니다": 예상 한 결과에 따라 다릅니다. 부동 소수점 수학이 포함될 때 대부분의 사람들의 직감은 실패합니다. 실수는 무제한의 정밀도를 가지며, 대부분의 사람들은 부동 소수점 숫자가 처음처럼 정확하게 동작 할 것으로 기대합니다. 그러나 부동 소수점 숫자는 정밀도가 제한되어 ** 실제 숫자처럼 ** 작용할 수 없습니다. 그러나 고려해보십시오 :'int i = 1; i = 3; i * = 3;'및'float f = 3; f/= 3; f * = 3;'. 아무도 0을 생산하는 첫 번째 제품에 문제가 있지만 많은 사람들은 두 번째 제품이 1을 생산하지 않는다는 사실에 놀랐습니다. –

+0

계산이 float을 여러 번 포함하면 결과가 점차 컨트롤을 잃을 것입니다. 0.799999999가됩니다. –

관련 문제