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 assumption:real(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
作为种类值)。
在下面的代码中,我将 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 assumption:real(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
作为种类值)。