왜
printf("is 0.5 <= 0.49999999999999999 ? %s", 0.5 <= 0.49999999999999999 ? "true":"false" );
반환
is 0.5 <= 0.49999999999999999 ? true
* 이건 숙제가 아니라 호기심뿐입니다.
질문에 대답하는 가장 좋은 방법은 코드 줄을 약간 변경하는 것입니다.
printf("is %.16e <= %.16e ? %s", 0.5, 0.49999999999999999, 0.5 <= 0.49999999999999999 ? "true":"false" );
이 줄을 컴파일 0.49999999999999999
하면 가장 가까운 표현 가능 값으로 반올림되는 것을 볼 수 있습니다 double
. 이는 for와 동일합니다 0.5
(실제로 정확한 값 1/2을 나타냄). 이것은 하나가 다른 것보다 낮거나 같은 이유를 설명합니다. 그들은 같은 것에 대해 두 개의 다른 표기법입니다.
참고 : %.16e
이 형식에는 고유 한 배정 밀도 부동 소수점 숫자에 대해 동일한 것을 인쇄하지 않는 속성이 있으므로 형식 을 선택했습니다 . 전문가들은 16 진수 형식을 선호합니다 %a
. 16 진수는 더 간결 할뿐만 아니라이를 사용하면 0.5
정확히 표현되고 ( 0x0.8p0
또는 0x1.0p-1
), 0.1과 같은 다른 10 진수는 그렇지 않음 (16 진수에서는 숫자가 반복되고 모든 유효 숫자를 사용함) 이 즉시 명확 해 집니다 . 간단히 말해서, 부동 소수점 숫자를 입력하고 인쇄하기 위해 16 진수를 사용하면 즉시 전문가가 될 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다