首页 > 解决方案 > Fortran 中的浮点运算

问题描述

我继承了一些我试图理解的 Fortran 代码。它在许多地方使用 REAL 变量,我认为它不应该 - 但也许我误解了它在 Fortran 中的工作原理(与我更熟悉的 C++ 相比),因此这个问题。

因此,所讨论的变量本质上是“分类值”、“因子”或“枚举”,具体取决于您如何看待它/想要调用它。它们的数据类型为 REAL,只能采用有限数量的预定整数值。所以说变量 a 的值只能是 1、2 或 3。这些值是从外部文件中读取的;在这些外部文件中,它们表示为整数,因此这不是“外部数据源中的舍入问题”之类的情况。

但是在代码中,它从不进行直接比较,总是大于/小于检查。所以,而不是做

if (a == 1) then

它确实

if (a > 0.9 .and. a < 1.1) then

您可以想象这会变得非常混乱/令人厌烦,尤其是当它需要检查一个值是否是多个类别之一时。

所以我认为这是一种情况,有人在某些时候听到“从不比较 REAL 值”(由于存储浮点值的有限精度的性质,每个编程语言都存在同样的问题),但后来并没有了解何时适用(我猜第一个错误是分类值应该表示为整数值,但现在情况就是这样)。

OTOH 也许我只是误解了 REAL 和 INTEGER 值如何在 Fortran 中表示和工作?会不会有这样的情况

b = 1.5
a = REAL(INT(b))

if (a > 0.9 .and. a < 1.1) then

会有意义吗?

标签: fortran

解决方案


只有在您没有对实际值执行任何操作的情况下(只是分配一个值并将相等性与您分配的相同文字进行比较,具有相同类型的参数),您才不需要容忍。

问题是,对于一个实变量 a 例如:

Real a
a = 2

你可以确定

a == 2

将永远.true.。但是,例如,对于由 b 表示的另一个实数值:

a  / b * b == 2

(或任何其他操作)不保证为 .true。


推荐阅读