2015-05-26 187 views
0

我需要轉換一個Fortran代碼轉換爲C++之一,我有以下問題:錯精度雙重價值

我試圖計算命名R12兩者的Fortran 77和C++語言,但我的雙精度值獲得了彼此非常接近的兩個值,但具有兩個不同的精度。這裏是我的Fortran代碼:

R12 = sqrt(95699.68D0+1123.6D0*flx) - 408.99D0 

double flx = 192.9D0。我得到的值是R12 = 149.97522253177789

我做C++一樣:

R12 = sqrt(95699.68+1123.6*flx) - 408.99 ; 

我得到這裏的價值R12 = 149.97522253177794

你們可以幫我找到該差分距離,因爲它是非常重要的,我的工作有確切的精度

+3

定義 「精確精密」?使用浮點值你永遠不會有「精確的精度」,而對於非理性數字,無論如何你都需要無限精度。 'double'具有15-17的精確度,這就是你在這裏所得到的。 –

+0

你也可以在這裏閱讀更多關於這個:http://en.wikipedia.org/wiki/Machine_epsilon – CppChris

+0

你是否檢查過(1)乘法的結果在兩種語言中都是相同的? (2)這兩種語言的添加結果是相同的? (3)'sqrt'的結果在兩種語言中都是相同的?您需要在SO之前詢問問題的實質。 –

回答

5

隨着雙精度,你的尾數精度52 bits (roughly 15 decimals)。你的情況是這樣的:

Fortran語言:

0.14997522253177789e3 
       ^

C++

0.14997522253177794e3 
       ^

你可以看到,無論結果是相同的多達15日的數字。我的猜測是C++和Fortran對十進制系統應用了不同的轉換(四捨五入)。

Fortran中2003+你可以給一個ROUND說明符write

program test 

    write(*,*)      'Default ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0 
    write(*,*,round='UP')   'UP   ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0 
    write(*,*,round='DOWN')  'DOWN  ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0 
    write(*,*,round='ZERO')  'ZERO  ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0 
    write(*,*,round='NEAREST')  'NEAREST ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0 

end program 

結果

Default 149.97522253177794  
UP  149.97522253177795  
DOWN  149.97522253177794  
ZERO  149.97522253177794  
NEAREST 149.97522253177794 
+0

嗯,我知道,但事情是,那裏有很多算術指令,所以在我的程序結束時,差別越來越大 –

+1

我的猜測是數字在二進制表示*中是相同的,但是你應該檢查一下!順便說一句:我在Fortran中獲得與C++完全相同的結果... –