2013-11-04 38 views
0

AIX 및 Linux에서 복잡한 응용 프로그램을 실행하려고하는 시나리오가 있습니다.fortran 내장 함수 sqrt() 동작

실행 중에 코드는 계산을 위해 내장 함수 sqrt()를 사용하지만 얻은 결과는 두 시스템에서 모두 다릅니다.

누구든지이 동작에 대한 이유를 알고 있습니까? 이것을 극복 할 수있는 방법이 있습니까?

P.S

일부 값이 두 시스템에 동일하지만 그들 중 대부분은 다르다.

+0

'복잡한'또는 '복잡한'을 의미합니까? –

+0

@HighPerformanceMark i는 복잡한 의미입니다. – arunr

답변

4

IEEE 754 사양을 따르는 프로세서는 제곱근에 대한 정확한 결과를 반환해야합니다. 또는 정확하게 표현할 수없는 경우 정확하게 반올림해야합니다. 동일한 입력 값, 부동 소수점 형식 및 반올림 모드의 경우 다른 IEEE 754 호환 프로세서가 동일한 결과를 반환해야합니다. 변형은 허용되지 않습니다. 다른 결과를 볼 수있는 가능한 이유 :

  1. 프로세서 중 하나가 IEEE 754 부동 소수점 사양을 따르지 않습니다.
  2. 값은 실제로 같지만 인쇄 관련 버그 또는 차이로 인해 값이 다르게 표시됩니다.
  3. 반올림 모드 또는 정밀 제어가 두 시스템에서 동일하게 설정되지 않았습니다.
  4. 하나의 시스템이 IEEE 754 사양을 따르려고하지만 제곱근 기능이 불완전합니다.

이진 출력을 비교하여 인쇄 서식 버그 또는 차이를 없앨 수 있습니까?

오늘날 대부분의 프로세서는 IEEE 754 부동 소수점을 지원합니다. IEEE 754 정확도가 보장되지 않는 예는 OpenCL native_sqrt 함수를 사용하는 것입니다. OpenCL은 native_sqrt (IEEE 754 호환 sqrt 외에도)를 정의하므로 원할 경우 속도를 정확하게 교환 할 수 있습니다.

IEEE 754 sqrt 구현의 버그는 오늘날 너무 일반적이지 않습니다.IEEE 754 sqrt 함수의 어려운 경우는 반올림 모드가 가장 가까운 것으로 설정되고 실제 결과가 두 개의 부동 소수점 표현 사이의 중간 지점 근처에있는 경우입니다. 이러한 어려운 제곱근 인자를 생성하는 방법은 William Kahan의 논문 (How to Test Whether SQRT is Rounded Correctly)에서 찾을 수 있습니다.

1

각 CPU에서 사용 가능한 부동 소수점 형식을 확인하십시오. 단 정밀도 또는 배정 밀도 부동 소수점을 사용하고 있습니까? 비슷한/비슷한 답변이 필요한 경우 두 시스템에서 비슷한 정밀도를 갖는 부동 소수점 형식을 사용해야합니다.

부동 소수점은 근사값입니다. 단 정밀도 부동 소수점은 가수에 대해 24 비트 (부호 비트 포함) 만 사용하고 지수의 다른 8 비트는 사용합니다. 이렇게하면 약 8 자리의 정밀도가 허용됩니다. 배정 밀도 부동 소수점은 53 비트를 사용하므로 훨씬 더 정밀합니다.

두 시스템에있는 부동 소수점 숫자의 이진 값에 대한 세부 정보가 부족하고 이러한 값의 인쇄 된 표현에 반올림 또는 표현 차이가 있습니다.

+0

두 컴퓨터에서 이미 형식을 지정했습니다. 형식은 동일하지만 결과는 다릅니다. 차이는 e-09 정도입니다. – arunr

+3

1e-9의 차이는 무엇입니까? [모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)을 읽어보십시오. –

2

두 컴퓨터의 하드웨어 또는 두 컴파일러의 sqrt 기능에 사용 된 알고리즘의 숫자 표현에 약간의 차이가있을 수 있습니다. 유한 정밀 산술은 실수의 산술과 ​​같지 않으며 계산상의 약간의 차이가 예상됩니다. 차이점이 비정상인지 여부를 판단하려면 사용중인 숫자 유형을 명시하고 (ChuckCottrill의 요청에 따라) 예제를 제공해야합니다. 상대적인 차이점은 무엇입니까? 순서 유니티의 값의 경우 1E-9는 단 정밀도 부동 소수점의 예상 차이입니다.