2013-08-05 10 views
4

일부 기하학적 변환을 계산하기 위해 프로그램을 프로그래밍하고 있는데 프로그램을 테스트하는 동안 이상한 것을 발견했습니다. 두 가지 다른 컴퓨터 인 Z400 워크 스테이션에서 테스트를 시작했습니다. 제온 ® 프로세서 W3550과 인텔 ® 제온 ® 프로세서 X5560와 Z800 워크 스테이션, 나는 하나 개의 작업에 대해 서로 다른 결과를 가지고 다음 Z400와다른 CPU에서 sin에 대한 다른 값

double x = 24.169408798217777 * sin(0.59420877837561048)/sin(0.97658754841928608) 

을 Z800이 값을 던졌습니다 동안 나는 x=16.330508228047432

있어 x=16.330508228047435

값은 마지막 숫자에 따라 다르며 그 값으로 많은 계산을하므로 불편을 겪습니다.

더 많은 선결 물을 얻기 위해 sinl을 사용해 보았습니다. 그러나 각 워크 스테이션마다 항상 동일한 값을 얻었습니다. 그게 뭐가 잘못 됐어? 어떻게 해결할 수 있습니까?

+0

참조 http://stackoverflow.com/questions/18056677/opencl-double-precision-different-from-cpu-double-precision/18058130#18058130 – Sven

+2

아니요, 이들은 동일한 값입니다. 수정해야 할 것은 결과를 문자열로 변환하는 코드뿐입니다. 15 자리 이상을 표시하지 마십시오. –

+0

값을 비교하면 어떻게됩니까? – imreal

답변

2

2 개의 계산 결과는 표시된대로 1 자리 10 진수와 아래에 표시된 1 진수 1 자리가 다릅니다. Z400은 정답에 더 가깝습니다. sin() 계산은 마지막 2 진 비트보다 정확해야하지만 1 비트 내에서 정확해야합니다. 좋은 sin() 구현은 마지막 비트 **에 맞습니다. 귀하의 Z800은 좋지 않습니다.

printf("%a\n", 16.330508228047432); 
printf("%a\n", 16.330508228047435); 
printf("%a\n", 24.169408798217777 * sin(0.59420877837561048)/sin(0.97658754841928608)); // my PC eclipse 

0x1.0549c2fee85cbp + 4
0x1.0549c2fee85ccp + 4
0x1.0549c2fee85cbp + 4

** 정확도 요구 사항은 IEEE 부동 소수점 하나 순전히 C++ 요구하지 않습니다. Trig는 1 ulp (단위 마지막 위치) 내에서 s/b의 정확성을 나타냅니다. 좋은 trig 라이브러리는 0.5 ulp 내에서 정확합니다 (마지막 위치). 가장 좋은 대답입니다.

+0

그래서 더 나은 가치를 얻을 수 없다는 것을 의미하며 두 기계에서 동일한 값을 얻으려면 숫자를 잘라야합니다. – Brujah

+0

절단이 항상 같은 대답을 얻지는 않습니다. .xxx1000을 .xxx0999와 비교하고 마지막 세 자리를 자릅니다. 답은 1e7에서 1 부분과 같지만 절단 결과가 다릅니다. 반올림도 같은 문제를 나타냅니다. 한 가지 해결책은 최소한의 상대적인 차이를 허용하는 것입니다. 9e15에서 약 1 부분. (DBL_EPSILON) – chux

+0

@ Brujah 2 대의 기계에서'sin (0.5942 ... 8)'과'sin (0.9765 ... 8)'을 확인해보십시오. 이 답변의 유효성을 확인하는 데 최소한 1 가지 차이가 ​​있음을 확인하는 것이 실제로 상황에 맞는 정답입니다. – chux

1

추측 하건데, 이것은 (64 비트가 아닌) 80 비트 레지스터에서 부동 소수점 값을 계산하고 가능한 한 늦게 정밀도 만 줄이는 특정 프로세서와 관련이 있음을 제안 할 것입니다.

GCC에서는 -ffloat-store을 사용하여 모든 수학이 64 비트에서 수행되고 잠재적으로 약간 더 느려질 수 있습니다.

this answer에 대한 추가 제안으로 80 비트 레지스터가 실제 문제 일 때 도움이 될 수 있습니다.

+0

MVSC에서 일하고 있습니다. 비슷한 옵션이 있습니까? – Brujah

+0

나는/fp : precise를 원한다고 생각한다. http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx –

+0

내 모든 프로젝트에서 말한 것처럼 그 깃발은 이미 설정되었습니다. – Brujah