Fortran 不能做865398.78 和-865398.78 之间的加法吗?为什么答案是-0.03?

Is Fortran unable to do the addition between 865398.78 and -865398.78? Why the answer is -0.03?

在下面的代码中,我将 865398.78 和 -865398.78 相加。我希望得到 0,但我得到的是 -0.03。

源代码:

program main
real(8) :: x

open(10,file="test.txt")
read(10,*)x
print *,"x=",x
x=x+865398.78
print *,"x+865398.78=",x
end program

结果:

x=  -865398.780000000     
x+865398.78= -3.000000002793968E-002

我对 "read" 代码或其他代码的使用有误吗?

数字 865398.78 在您的代码中以单精度表示。单精度可以处理大约 7 位有效数字,而您的数字有 8 位。您可以通过编写

使其成为双精度
x=x+865398.78_8

我会在这个答案中做一个 big assumptionreal(8) 对应于 double precision

您可能假设您的 865398.78 无论出现在什么地方都意味着同样的事情。在源代码中是正确的:它是一个默认的实数常量,近似于 865398.78。

当你有

x=x+865398.78

对于x双精度,则默认实常数转换为双精度值。

但是,在读取语句中

read(10,*)x

给定输入“-865398.78”,然后 x 对该值进行双精度近似。

您的非零答案来自这样一个事实,即转换为双精度值的默认 real/single 精度近似值通常不是一般情况,在这种情况下与初始双精度值不同精度近似。

最后一个事实在其他问题中有更详细的解释。使用 x=x+865398.78_8 的解决方案(或者更好,不要使用 8 作为种类值)。