문제

나는 단지 GDB를 사용하여 더블의 값을 인쇄하고 놀랍게도 -0 인쇄했습니다.

C에서 -0 값의 두 배 평균은 무엇입니까?

그건 그렇고, 내가 0으로 평등을 확인했을 때 그것은 사실이 반환되었습니다. 비교를하기 위해 나는 다음을 수행했습니다.

GDB에서

> print some_double
-0
> print some_double == 0
1
도움이 되었습니까?

해결책

음의 제로 수치 컴퓨팅에 유용한 개념이며 C의 유효한 부동 소수점 번호입니다.

다른 팁

이것은 잘 알려진 문제입니다 printf. 부동 소수점 번호를 사용하고 있으므로 바이너리에서는 가능한 하나의 표현이 없습니다. 그리고 대부분의 시간은 이진 표현이 완벽하지 않습니다. 따라서 0은 다음과 같이 저장됩니다 0.00000000000000...0042 때때로 그리고 AS -0.000000000000000000000123. Printf가 두 번째를 인쇄하면 홀수 -0을 얻습니다.

나는 당신이 0을 비교하는 방법을 정말로 모르고, 불량을 조정하기 위해 부동 소수점 비교를 할 때 엡실론을 추가하는 것을 잊지 마십시오. 예 : a == b 하지만 fabs(a-b) < 1e-13 여기서 1E-13은 엡실론입니다 (귀하에게 적합한 지수를 선택하십시오).

실제로 4 장에서 "Great Code, Volume 1"책을 읽는 책을 읽는 저자는 IEEE FP 표준에서 서명 된 플로트를 표현하기 위해 1의 보완을 사용하기 때문입니다. 그는 말한다 :

Mantissa는 2의 보완 대신 보완 형식을 사용합니다. 이는 Mantissa의 24 비트 값이 단순히 서명되지 않은 이진수이며 비트 위치 31에서 부호 비트는 해당 값이 양수인지 음수인지를 결정합니다. 보완 숫자는 특이한 속성을 가지고 있습니다 0에 대한 두 가지 표현이 있습니다 (부호 비트 세트 또는 클리어 포함). 일반적으로 이것은 플로팅 포인트 소프트웨어 또는 하드웨어 시스템을 설계하는 사람에게만 중요합니다.

강조 광산

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top