【问题标题】:Deliberately using NaN in Fortran在 Fortran 中故意使用 NaN
【发布时间】:2018-07-08 03:11:33
【问题描述】:

我已阅读有关在 Fortran 比较中使用 NaN 的信息性文章(herehere) 我想我已经大致了解了正在发生的事情。

我的问题更多的是关于一般 NaN 的使用。

假设我有一组实数,但我不知道它们的值是什么。因此,我将它们全部设置为 NaN,并且实际上,我使用 NaN 来部分表示“未分配”。关于这是否是个好主意,似乎有一些debate,我已经阅读了使用巨大(1.0)或其他“幻数”的建议。

但使用 NaN 似乎有真正的好处,因为任何涉及 any 值 NaN 变量的计算都将导致 NaN。这很有帮助(并且在数学意义上可能是“正确的”)。

例如,如果 x 设置为 NaN,并且 y 为 1.23,则

z = x + y
z = x - y
z = x * y
z = x / y

总是会导致 z 为 NaN(至少它与 Windows 上的 Intel v18 一样)——这就是我想要的:z 是未知的,因为 x 是未知的。

那么 - 这是可接受的 NaN 用法吗?还是我制造了我还没有意识到的问题?

【问题讨论】:

  • 当然,将变量标记为未分配的(也许是)另一种方法是不分配它。

标签: fortran ieee-754


【解决方案1】:

您可以在许多编译器中使用-finit-real 之类的开关自动执行此操作。它可能很有用,这就是他们提供此开关的原因。许多编译器都提供此功能。

请注意,有两种 NaN。一个安静的 NaN 和一个信号 NaN。使用 he 信号 NaN 将触发浮点异常。

是否优先于不同的哨兵值几乎只是一种意见,所以我不会回答这个问题,基于意见的问题和民意调查在这里是题外话。我们不能在你链接的辩论中继续在这里(Is it a good idea to use IEEE754 floating point NaN for values which are not set?)。在今天的标准中,我认为这不是一个好的 SO 问题(注意它有多老了!),其中许多答案在今天都站不住脚,但如果有人要添加更多内容,他们可以在那个问题中做到这一点, 没必要在这里提出来。

【讨论】:

  • -finit-real=nan 非常有用,可以为我节省几行代码。
  • 那么我可以安全地使用 NaN 来有效地进行错误检查吗(即任何涉及 NaN 的计算都会导致 NaN,因此在尝试计算之前我不需要检查)?或者这会以某种我不理解的方式对我产生影响?!
  • 这真的取决于计算本身。如果您的意思是简单的算术,那么大多数情况下是的。而且还取决于您所说的“错误检查”是什么意思。有许多类型的错误。我个人觉得 valgrind 和 sanitizations 更有帮助。但是将数组初始化为无意义的值可以为您提供早期警告,这非常有帮助。
猜你喜欢
  • 2012-11-25
  • 1970-01-01
  • 2012-01-22
  • 2023-04-05
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
相关资源
最近更新 更多