在下面的代码中我加在一起865398.78和-865398.78。我期望得到0,但是我得到-0.03。Fortran无法在865398.78和-865398.78之间添加?为什么答案是-0.03?
源代码:
结果:
x= -865398.780000000
x+865398.78= -3.000000002793968E-002
我错了以 “读” 代码或别的什么用途?
在下面的代码中我加在一起865398.78和-865398.78。我期望得到0,但是我得到-0.03。Fortran无法在865398.78和-865398.78之间添加?为什么答案是-0.03?
源代码:
结果:
x= -865398.780000000
x+865398.78= -3.000000002793968E-002
我错了以 “读” 代码或别的什么用途?
数字865398.78在您的代码中以单精度表示。单精度可以通过写
x=x+865398.78_8
它的作品!非常感谢。 –
在这个答案中,'8'是一种参数,通常是指双精度。但双精度是*不*总是8,而用8来定义双精度已经过时了。 – Ross
加上@Ross,'d0'将会是一个更合适的后缀,用于将数字转换为双精度,即'865398.78d0'。 –
处理大约7显著位数,而你的电话号码有8可以让双精度我会做出这样的回答一个big assumption:那real(8)
对应double precision
。
您可能会认为您的865398.78
在任何地方都表示相同的东西。在真实的源代码中:它是一个默认的真实文字常量,接近865398.78。
当你
x=x+865398.78
为x
双精度,则默认实常数被转换为双精度值。
然而,在读声明
read(10,*)x
给定输入“-865398.78
”然后x
需要一个双精度逼近该值。
你的非零答案来自一个事实,即将一个默认的实数/单精度逼近转换为双精度值并不普遍,并且在这种情况下,与初始双精度逼近不同。
最后这个事实在其他问题中有更详细的解释。正如使用x=x+865398.78_8
(或更好的,不要使用8
作为种类值)的解决方案。
我已经内嵌了你的图像,但是如果你可以将它转换成纯文本(你已经有源代码在这里,但输入文件会更好的文本)可能会更好。我也已经把这个问题解释为了问题(并且假设你期望0作为结果):如果你对我所做的不满意,那么你可以恢复我的编辑。 – francescalus