gpt4 book ai didi

c++ - val != std::numeric_limits::infinity() 或 !isinf(val) 或 isfinite(val)

转载 作者:可可西里 更新时间:2023-11-01 18:37:32 29 4
gpt4 key购买 nike

这可能是 bike-shedding ,但也许我遗漏了一些有趣的东西......

如果一个类初始化一个成员valstd::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 会是一个更安全的选择吗?

这是我在阅读此代码的补丁时出现的:

为了便于引用:

相关排序:

最佳答案

使用这些特殊值作为初始化标志只有在变量无法以其他方式获得特殊值时才有效。就数学运算而言,无穷大并不难得到,因为溢出也会得到它。所以这可能会有问题。如果唯一不变的是用户无法将此浮点值设置为此值,则使用安静的 NaN(如果可用)会更容易使用。

就三种方法而言,只有方法“a”与初始值完全匹配。因此,如果不变量是只有初始值代表初始化值,那么这是最准确的方法。当然,这些方法都没有从一开始就保护不变量做任何事情,我更关心的是:是否或可以有效地执行不变量。

虽然这不是一个代码审查网站,但就链接代码编辑到 OGREnvelope 而言github 上的类(看起来只是一个 AABB),我认为有几点需要注意:

  • IsInit - 基于其代码 - 似乎意味着要返回 AABB 是否实际上已由用户设置。不是它是否处于可以说是 IsInit 的初始状态/值建议(并误导我相信)。我个人更喜欢 IsValid 这样的名字对于这个测试。
  • 至于不变量实际上是什么,编辑本身似乎认识到有效的 AABB 永远不应该有 MinX。大于 MaxX 的值也不是 MinY大于 MaxY .换句话说,它们永远不应在有效的 AABB 中被逆转。 MinX应始终小于或等于 MaxX (对于最小和最大 Y 变量也是如此)。
  • 像现在这样使用反向无穷大值,可以:(a) 更容易潜在地增加 AABB 以包含其他 AABB(编辑演示了我将代码行从 14 减少到 4 的意思); (b) 使其能够处理比使用 max() 范围更广的有效 AABB。和 lowest()值(value)观会。
  • MinX 的事实, MaxX , MinY , MaxY成员变量可公开访问意味着 IsInit不变量本身只是建议性的,因为没有封装来保护不变量。

在注意到这些事情的更广泛背景下,NaN 是不合适的。不变量从来都不是真正的MinX != std::numeric_limits<double>::infinity() .和 IsInit (在该代码中实现)充其量是不完整的。在它被重命名为类似 IsValid 的上下文中,那么逻辑上更一致的实现是:

bool IsValid() const
{
return !std::isnan(MinX) && !std::isnan(MinY) && MinX <= MaxX && MinY <= MaxY;
}

通过此实现,有效的 AABB 是 OGREnvelope其值都是有效数字(没有一个是 NaN)并且其最小值必须分别小于或等于 X 和 Y 的最大值。

关于c++ - val != std::numeric_limits<double>::infinity() 或 !isinf(val) 或 isfinite(val),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42930445/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com