2015-10-24 14 views
1

在下面的代码中我加在一起865398.78和-865398.78。我期望得到0,但是我得到-0.03。Fortran无法在865398.78和-865398.78之间添加?为什么答案是-0.03?

The Fortran code and the result

源代码:

​​

结果:

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

我错了以 “读” 代码或别的什么用途?

+2

我已经内嵌了你的图像,但是如果你可以将它转换成纯文本(你已经有源代码在这里,但输入文件会更好的文本)可能会更好。我也已经把这个问题解释为了问题(并且假设你期望0作为结果):如果你对我所做的不满意,那么你可以恢复我的编辑。 – francescalus

回答

5

数字865398.78在您的代码中以单精度表示。单精度可以通过写

x=x+865398.78_8 
+0

它的作品!非常感谢。 –

+3

在这个答案中,'8'是一种参数,通常是指双精度。但双精度是*不*总是8,而用8来定义双精度已经过时了。 – Ross

+3

加上@Ross,'d0'将会是一个更合适的后缀,用于将数字转换为双精度,即'865398.78d0'。 –

3

处理大约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作为种类值)的解决方案。

相关问题