我是新来FORTRAN90,我写一个简单的程序,添加两个浮点数如下:Fortran语言计算总和没有得到确切的精度
program Numbers_sum
implicit none
REAL :: sum
sum = 1.6+2
print*,"Sum =", sum
end
我得到的答案为Sum = 3.5999999
为什么它没有得到3.6
。我怎样才能让这个程序得到确切的答案?任何帮助将不胜感激。
我是新来FORTRAN90,我写一个简单的程序,添加两个浮点数如下:Fortran语言计算总和没有得到确切的精度
program Numbers_sum
implicit none
REAL :: sum
sum = 1.6+2
print*,"Sum =", sum
end
我得到的答案为Sum = 3.5999999
为什么它没有得到3.6
。我怎样才能让这个程序得到确切的答案?任何帮助将不胜感激。
在有限数字的基数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
但即使这样也不会消除完全舍入。
干杯
我收到错误: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
@francescalus nope它不是。仔细阅读。它是Fortran。我试过C++和Python也没有这样的问题! – Santhucool
这是一个关于浮点数的问题。或许,C和Python之间会有什么不同,但是您正在使用的可能是单精度IEEE数字而不是双精度。从根本上说,在Fortran变得重要之前,您需要了解其他问题/答案:即使'1.6d0 + 2d0'也不会给您提供'3.6'。 – francescalus
@francescalus好的我同意。但是为什么C++和Python给出了3.5999999的3.6版本的正确答案。????????? – Santhucool