Fortran中的浮点运算

时间:2018-06-05 13:10:47

标签: fortran

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

因此,所讨论的变量基本上是分类值','因素'或者'枚举'取决于你如何看待/想要称呼它。它们的数据类型为REAL,并且只能采用有限数量的预定整数值。所以说变量a只能是值1,2或3.这些值是从外部文件读入的;在这些外部文件中,它们表示为整数,因此它不是外部数据源中的舍入问题的情况。什么的。

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

if (a == 1) then

确实

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

你可以想象这会让人感到非常困惑/厌倦,特别是当它需要检查一个值是否属于多个类别之一时。

所以我认为这是某种情况,某些人在某些时候听说过“永远不会比较真实的价值观”。 (由于存储浮点值的有限精度的性质,每个编程语言都存在同样的问题),但是当适用时却没有真正理解(我猜第一个错误是分类值应该是表示为整数值,但这种情况就是现在的情况。)

OTOH也许我只是误解了REAL和INTEGER值在Fortran中的表现和工作方式?可能会出现

的情况
b = 1.5
a = REAL(INT(b))

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

会有意义吗?

2 个答案:

答案 0 :(得分:3)

仅在您没有使用实际值执行任何操作的情况下(只需指定一个值并将相等的数字与您指定的相同文字进行比较,使用相同的类型参数),您将不需要容差。

对于真正的变量a,例如:

Real a
a = 2

你可以肯定

a == 2

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

a  / b * b == 2

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

答案 1 :(得分:1)

如果由于某种原因变量必须保持REAL,那么你可以使用 比较中的内在Fortran函数NINT(最接近的整数):

if( nint(a) == 1 ) then 
....