【发布时间】:2017-08-13 07:34:37
【问题描述】:
这可能是bike-shedding,但也许我错过了一些有趣的东西......
如果一个类将成员 val 初始化为 std::numeric_limits<double>::infinity() 并且稍后想要检查 val 是否已更改为有效的值(+/- inf 在这里无效),那么这 3 种方法的权衡是什么?我想念任何其他有趣的方法来解决这个问题。 (为了便于阅读,示例中删除了 const。)
bool IsInit() { return MinX != std::numeric_limits<double>::infinity(); } // a
bool IsInit() { return !std::isinf(MinX); } // b
bool IsInit() { return std::isfinite(MinX); } // c
目前代码是 C++03,但随着 C++11、C++14 和 C++17 的变化,选项将如何变化。例如对于 C++17,此代码可能只是 std::optional<double> val。或者如果 +/-inf 在未来变得有效,那么安静的 NaN 会是一个更安全的选择吗?
当我阅读此代码的补丁时出现了这个问题:
- https://github.com/OSGeo/gdal/commit/30194c640f403008625ff0c8be7aca155ac7ebe1
- https://trac.osgeo.org/gdal/browser/trunk/gdal/ogr/ogr_core.h?rev=37821#L76
为了方便参考:
- std::numeric_limits::infinity()
- std::isinf
- std::isfinite
- std::numeric_limits::quiet_NaN
- std::optional
相关类:
【问题讨论】:
标签: c++ c++11 nan infinity numeric-limits