我继承了一些我试图弄清楚的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
会有意义吗?
答案 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
....