2015-04-23 61 views
0

我是新来FORTRAN90,我写一个简单的程序,添加两个浮点数如下:Fortran语言计算总和没有得到确切的精度

program Numbers_sum 

    implicit none 

    REAL :: sum 
    sum = 1.6+2 
    print*,"Sum =", sum 
    end 

我得到的答案为Sum = 3.5999999

为什么它没有得到3.6。我怎样才能让这个程序得到确切的答案?任何帮助将不胜感激。

+0

@francescalus nope它不是。仔细阅读。它是Fortran。我试过C++和Python也没有这样的问题! – Santhucool

+1

这是一个关于浮点数的问题。或许,C和Python之间会有什么不同,但是您正在使用的可能是单精度IEEE数字而不是双精度。从根本上说,在Fortran变得重要之前,您需要了解其他问题/答案:即使'1.6d0 + 2d0'也不会给您提供'3.6'。 – francescalus

+0

@francescalus好的我同意。但是为什么C++和Python给出了3.5999999的3.6版本的正确答案。????????? – Santhucool

回答

0

在有限数字的基数2中没有办法写3.6。这是2 + 1 + 1/2 + 1/16 + ...

你可以,但是,通过选择正确的格式隐藏舍入误差:

write(*, '(F11.6)') sum 

如果你想要更高的精度来计算,你可以这样做:

REAL(KIND=8) :: var 

或者,如果你想真正适合:

program numbers_sum 
    implicit none 
    integer, parameter :: dp = selected_real_kind(P=12) 
    real(kind=dp) :: sum1 
    sum1 = 1.6_dp + 2 
    print *, "Sum = ", sum1 
end 

但即使这样也不会消除完全舍入。

干杯

+0

我收到错误:sum.for:在程序'numbers_sum': sum.for:3: 整数,参数:: DP = selected_real_kind(P = 12) ^ Fortran 90的特征在(^)不受支持 总和(^)[ ally在(^)]处查看] sum.for(3):3: 整数,参数:: dp = selected_real_kind(P = 12) ^ 无效声明或引用符号'selected_real_kind' :3: integer,parameter :: dp = selected_real_kind(P = 12) ^ ... – Santhucool