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"와 같습니까?
미리 감사드립니다.
WOW! 방금 네가 옳은지 테스트 했어. 나는이 기이 한 방법으로 가치가있는 것을 알지 못했습니다. 계산이 float 또는 double을 포함하는 한 결과는 예상대로 결과가 보장되지 않습니다. –
@ 彭浩翔 - "예상대로 결과가 나올 수 없습니다": 예상 한 결과에 따라 다릅니다. 부동 소수점 수학이 포함될 때 대부분의 사람들의 직감은 실패합니다. 실수는 무제한의 정밀도를 가지며, 대부분의 사람들은 부동 소수점 숫자가 처음처럼 정확하게 동작 할 것으로 기대합니다. 그러나 부동 소수점 숫자는 정밀도가 제한되어 ** 실제 숫자처럼 ** 작용할 수 없습니다. 그러나 고려해보십시오 :'int i = 1; i = 3; i * = 3;'및'float f = 3; f/= 3; f * = 3;'. 아무도 0을 생산하는 첫 번째 제품에 문제가 있지만 많은 사람들은 두 번째 제품이 1을 생산하지 않는다는 사실에 놀랐습니다. –
계산이 float을 여러 번 포함하면 결과가 점차 컨트롤을 잃을 것입니다. 0.799999999가됩니다. –