fortran - 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
会有意义吗?
解决方案
只有在您没有对实际值执行任何操作的情况下(只是分配一个值并将相等性与您分配的相同文字进行比较,具有相同类型的参数),您才不需要容忍。
问题是,对于一个实变量 a 例如:
Real a
a = 2
你可以确定
a == 2
将永远.true.
。但是,例如,对于由 b 表示的另一个实数值:
a / b * b == 2
(或任何其他操作)不保证为 .true。
推荐阅读
- mysql - 如何在nodejs中使用sequlize连接mysql数据库和多个数据库
- javascript - 是否有使用反应路由器隐藏组件的最佳实践方法?
- javascript - 从 ReactJS 中的路径图像动态加载的位置
- c - Check status of processes by signals in C
- c++ - 'random' numbers after exact numbers
- python - Use Pandas to Find Average Number of Occurrences in a Dataframe
- html - 居中对齐标题菜单
- ios - 如何将子视图控制器添加到 TableViewController
- r - separating data with respect to month, day, year and hour in R
- google-analytics - 如何在 Gatsby JS 的页面根目录中手动添加 .txt 文件?