2011-12-04 2 views
6

저는 윈도우와 리눅스에서 프로그램을 C++로 실행하고 있습니다. 출력은 동일해야합니다. 나는 유일한 차이점이 실제 판촉 차이에 반대하는 진정한 차이점인지 확인하려고 노력하고 있습니다. 지금까지 나는 차이점을 처리했습니다. \ r \ n 차이점 하지만 알아낼 수없는 것이 하나 있습니다. 창문에 서명 된 제로 리눅스 대 윈도우

은 밖으로 0.000와 리눅스에서 어떤 일이 무엇인지는 그 차이를 만드는 될 수 있습니다 알고 있지 -0.000

입니다 거기 넣어? 아마 최적화 프로그램이 일부 FP 계산을 최적화하는 방법의 차이에서 오는 고맙습니다

+4

관련 코드를 출력하지 않아서 말하는 것이 어렵습니다. – favoretti

+0

아무렇게나 표시되거나 변경된 내용은 차이가 없습니다. 부호가 있거나 부호없는 0으로 무엇을 할 것입니까? 추가할까요? 그게 끔찍하니? 그것으로 나눌까요? – FailedDev

+0

@FailedDev : 차이가 있습니다. 0 인 경향이있는 함수를 생각해보십시오. y 축의 음수 부분이나 y 축의 양의 부분에서 올 수 있습니다. – ninjalj

답변

1

IEEE 부동 소수점 형식에서 부호 비트가 값과 분리되어 있기 때문에 양수 값과 음수 값이 서로 다른 두 값인 0이 있습니다. 대부분의 경우 차이가 없습니다. 두 제로 모두 평등을 비교할 것이고 실제로 수학적으로 동일한 값을 설명합니다 (수학적으로 0과 -0은 동일합니다). 차이가 큰 부분은 언더 플로우가 발생했을 때 언더 플로가 양수 값에서 발생했는지 아니면 음수 값에서 발생했는지를 알아야 할 때입니다. 또한 0으로 나누면 0의 부호에 따라 무한대의 부호가 달라집니다 (예 : 1/+ 0.0 give + Inf, 1/-0.0은 -Inf를 제공). 다른 말로하면, 아마도 그것은 당신에게 영향을 미치지 않을 것입니다.

그러나 출력이 다르다고해서 반드시 번호 자체가 다른 것을 의미하지는 않습니다. Windows의 값도 -0.0이지만 Windows의 출력 루틴은 +0.0과 -0.0을 구분하지 않습니다.

7

(즉, 구성 할 수 있습니다 - 예를 들어, here 참조) 한 경우에는 0보다 약간 작은 값을 얻고, 다른 쪽에서는 약간 더 값을 얻습니다. 두 출력 모두 반올림되어 0.000으로 표시되지만 "실제"부호가 유지됩니다.

1

-ffast-math과 같은 (안전하지 않은) 플래그를 사용하지 않는 한 컴파일러는 ''IEEE-754 산술을 최적화 할 때 만들 수있는 가정이 제한됩니다. 먼저 두 플랫폼이 동일한 반올림을 사용하고 있는지 확인하십시오.

또한 가능하면 동일한 부동 소수점 단위를 사용하는지 확인하십시오. 즉 x86에서의 SSE vs FPU. 후자는 수학 라이브러리 함수 구현, 특히 삼각 함수/초월 함수와 관련된 문제 일 수 있습니다.

+1

어떻게 그들이 사용하고있는 부동 소수점 단위를 확인합니까? – user690936

관련 문제