fortran条件语句如何处理浮点数据类型?
我有一个简单的fortran条件语句如何处理浮点数据类型?,fortran,Fortran,我有一个简单的if条件语句,它比较两个实数(一个是从导入模块中分配和初始化的数组中读取的),但在不应该的时候失败了 在什么情况下会发生这种情况 我正在使用英特尔编译器 编辑: 为了进一步澄清,我正在这样做: if (12.2272 >= -5.0000) then do something else print *, 'fail' endif 我的失败了。当我仅使用而不是=进行计算时,情况也是如此。通常,由于浮点数固有的不精确性,您只能使用一些公差可靠地比较浮点数。一般来说,除了
if
条件语句,它比较两个实数(一个是从导入模块中分配和初始化的数组中读取的),但在不应该的时候失败了
在什么情况下会发生这种情况
我正在使用英特尔编译器
编辑:
为了进一步澄清,我正在这样做:
if (12.2272 >= -5.0000) then
do something
else
print *, 'fail'
endif
我的
失败了
。当我仅使用
而不是=
进行计算时,情况也是如此。通常,由于浮点数固有的不精确性,您只能使用一些公差可靠地比较浮点数。一般来说,除了一些特殊情况外,根本不应该进行相等性比较,例如将直接读取的值与一些小整数(通常为0)进行比较
如果您使用其中一个数字进行了任何非平凡的计算,则根本不要比较等式。通过一定的公差,您可以使用:
if (abs(a-b)<eps) ...
通常情况下,比较失败的原因是程序员没有完全理解正在发生的事情。如果看不到你的代码,我不会冒险做任何其他猜测。是的,我不明白,这就是我提出这个问题的理由。我添加了一些伪代码来描述我的问题。谢谢你的帮助!您发布的伪代码应该
执行一些操作
。但您的问题描述,特别是表示从导入模块中分配和初始化的数组中读取一个的位,使我怀疑分配和初始化没有按照您的预期工作。我仍然认为问题源于您(错误地)认为是正确的部分代码,但我仍然无法进一步提供帮助。从另一个模块读入的分配数组在我正在使用的代码中广泛使用,没有任何问题(据我所知),但在我的场景中,它似乎是错误的。我已经用print
语句等检查了所有功能,直到出现故障,所以我只是希望条件语句和分配的实变量存在一些已知问题。很难将我的代码压缩到适合这种情况的长度和清晰度。再次感谢。
real x
integer i
x = 0
do i = 1,10
x = x + 0.1
end do
print *, x, x==1
end