【发布时间】:2013-07-10 23:56:57
【问题描述】:
由于gcc 选项-ffast-math 有效地禁用了NaN 和-/+inf,我正在寻找在我的性能关键数学代码中表示NaN 的下一个最佳选项。理想情况下,如果对(add、mul、div、sub 等)进行操作,sentinel 值会像NaN 那样产生sentinel 值,但我怀疑这是可能的,因为我认为NaN 是唯一可以完成的值这。 -0.0 可能不太适合,因为它在 -ffast-math 中也被禁用,并且可能会阻止某些优化,例如 (x+0.0) 等。
也许我的问题应该是,有没有什么方法可以使用NaN 或其他一些“特殊双精度”,同时能够在不崩溃的情况下启用大量数学优化?
系统是Linux/x64, gcc 4.8.1。
【问题讨论】:
-
这个帖子可能会有所帮助Mingw32 std::isnan with -ffast-math
-
@ShafikYaghmour 谢谢,这个帖子很有帮助。
-
还有使用
-fno-finite-math-only -ftrapping-mathlua-users.org/lists/lua-l/2009-04/msg00091.html的选项 -
我同样想知道返回浮点值的函数的良好哨兵。我决定使用
optional,如optional<float>或optional<double>。除了明确意图之外,我认为这还具有对快速数学等编译器选项不太敏感的优点。这当然需要 C++17,或者使用boost::optional或编写自己的optional实现(这是我所做的,这对我来说似乎很容易)。
标签: c optimization double nan fast-math