'const'双重复制+比较安全吗?

Mic*_*rny 10 c++ floating-point

我注意到有很多关于浮点计算错误主题的讨论,要求你使用比复杂的更复杂的比较==.然而,所有这些文章似乎都假设值以某种方式被操纵(或双重计算),而我没有看到一个涵盖非常简单的常量复制的示例.

请考虑以下事项:

const double magical_value = -10;

class Test
{
    double _val;

public:
    Test()
        : _val(magical_value)
    {
    }

    bool is_special()
    {
        return _val == magical_value;
    }
};
Run Code Online (Sandbox Code Playgroud)

据我所知,magical_value应该在编译时设置,以便在该点进行所有舍入.之后,应该将值复制到类中,并与原始值进行比较.这样的比较是否保证安全?或者可以复制或比较在这里引入错误?

请不要建议替代比较或魔法价值使用方法,这是另一个主题.我只是对这个假设感到好奇.

编辑:请注意,我有点担心在某些体系结构上,优化可能会导致将值复制到不同大小的浮点寄存器,从而引入精确值的差异.有类似的风险吗?

dir*_*tly 2

这样的比较能保证安全吗?或者复制或比较会在这里引入错误吗?

是的,安全(这是复制操作的要求,如 所示=)。只要源类型和目标类型相同,您就无需担心转化/促销。

但请注意,magical_value可能不包含10精确值,而是包含近似值。该近似值将被复制到_val.

const定限定符,很可能magical_value会被优化掉(如果您打开优化)或按原样使用(即可能不会耗尽内存)。

  • 我非常怀疑是否存在“10”或“-10”不能完全表示为“double”的实现。 (3认同)