我有一个简单的if
条件语句,它比较两个实数(一个是从导入模块中分配和初始化的数组中读取的),当它不应该失败时。
在什么情况下会发生这种情况?
我正在使用英特尔编译器。
修改: 为了进一步澄清,我正在做这样的事情:
if (12.2272 >= -5.0000) then
do something
else
print *, 'fail'
endif
我得到了fail
。当我仅使用>
而不是>=
进行评估时也是如此。
答案 0 :(得分:1)
通常,您可以仅使用一些容差来可靠地比较浮点数,因为它们固有的不精确性。一般情况下,除了一些特殊情况外,你不应该比较相等,例如将直接读取值与一些小整数(通常为0)进行比较。
如果您使用其中一个数字进行任何非平凡计算,请不要比较相等。有了一些容差,你可以使用:
if (abs(a-b)<eps) ...
其中eps是一些小数字。它可以是epsilon
内在函数结果的一些(甚至很大)倍数。
阅读有关浮点的文章很有用,例如http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
您可以尝试这个小程序来查看浮点数的典型问题
real x
integer i
x = 0
do i = 1,10
x = x + 0.1
end do
print *, x, x==1
end