2014-11-17 4 views
4

x이 부동 소수점 숫자라고 가정 할 때, 나는 - (- x)이 일반적으로 x과 같은지 알고 싶습니다.부동 소수점 연산에서 - (- x) = x가 맞습니까?

x = max_floating_point_number/min_floating_number와 같은 코너 사례는 무시해 보겠습니다.

+2

아니요. 거의 동일하며 공차와 비교해야합니다. (일부 사람들이 떠있는 순간을하는 것처럼 요술 대신에 물어 보는 질문 +1) –

+0

@ R.MartinhoFernandes : 저는 아래의 Sneftel이 준 답변에 동의하는 경향이 있습니다 (귀하의 의견과는 대조적입니다). 부호 비트 만 변경 한 다음 부호 비트 만 다시 변경하면 원래 값을 얻게됩니다. –

답변

9

일반적으로 예; 부동 소수점 값을 부정하면 오류가 발생하지 않거나 정밀도가 떨어집니다. (조금 뒤집기 만하면됩니다.)

단 하나의 예외는 NaN입니다. - (- (NaN))는 NaN이지만 NaN은 다른 NaN과 비교하여 어떤 값과도 동일하지 않습니다. 그것은 단단히 "코너 케이스"의 영역에 있습니다.

+0

글쎄, 부동 소수점이 인코딩되는 방법과 우리가 말하는 언어에 달려 있지 않은가? – Shoe

+2

@ Jefffrey 아니요. 기호를 별도의 비트로 나타내지 않는 컴퓨터 부동 소수점 표현을 인식하지 못하고 있습니다. – Sneftel

4

질문에 프로그래밍 언어를 사용하지 않았으므로 IEEE 754 표준에 따라 NaN이 아닌 부동 소수점 값 x, x = - (- x)에 대한 대답은 예입니다.

잘못 구현되거나 잘못 지정된 언어의 경우 x은 NaN이 아닌 값으로 계산되어 - (- x) == x이 false로 평가 될 수 있습니다. 이것은 컴파일러가 일부 정밀도로 표현식을 계산하도록 허용되고 추가 정밀도에서 유형에 의해 지정된 정밀도로의 감소가 잘못 지정되거나 (C#) 또는 구현이 잘못됨 (일부 C 컴파일러 에서처럼) 일 수 있습니다. 이 경우 오른쪽에있는 x은 정밀도가 높은 값을 유지할 수 있으며 - (- x)은 유형의 정밀도로 계산 될 수 있으며 최종 결과는 다릅니다.

+0

네비게이션이 확장 된 정밀도로 수행되지 않은 경우라도 비교를 위해 중간 값을 확장 된 정밀도로 업그레이드하는 컴파일러를 알고 있습니까? – Sneftel

+0

@Sneftel이 예제는 이론적이지만, 최적화가 비활성화 된 경우 발생할 수 있습니다. 타입의 정밀도로 변환하지 않는 것은 정확하게 기억한다면 원래의 버그에서 GCC로 비난 받았던 것이고, 버그 323으로보고되었다. 레지스터 누출은'- (- x)'가 64 비트로 계산되기 때문에'- (- x) == x '가 발생하는 더 큰 표현식의 형태를 취할 수 있습니다. –

+0

@Sneftel "bug 323"은 다음을 말합니다 : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323. 엄격한 IEEE 754 의미론으로 컴파일 된 경우 버그 보고서의 프로그램은 "오류"를 인쇄하지 않습니다. 또한 GCC가 비교 전에 유형의 정밀도로 변환 된 경우 프로그램은 "오류"를 인쇄하지 않습니다. 따라서이 버그가보고 된 GCC 버전은 올바른 상황에서'- (-x) == x'를'0'으로 평가할 수 있습니다. 그러나 계산에 쏟아 지지만'x'는 레지스터에 남겨 둡니다. –