2015-05-26 125 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++完全相同的结果... –