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
应该在编译时设置,以便在该点进行所有舍入.之后,应该将值复制到类中,并与原始值进行比较.这样的比较是否保证安全?或者可以复制或比较在这里引入错误?
请不要建议替代比较或魔法价值使用方法,这是另一个主题.我只是对这个假设感到好奇.
编辑:请注意,我有点担心在某些体系结构上,优化可能会导致将值复制到不同大小的浮点寄存器,从而引入精确值的差异.有类似的风险吗?
这样的比较能保证安全吗?或者复制或比较会在这里引入错误吗?
是的,安全(这是复制操作的要求,如 所示=
)。只要源类型和目标类型相同,您就无需担心转化/促销。
但请注意,magical_value
可能不包含10
精确值,而是包含近似值。该近似值将被复制到_val
.
给const
定限定符,很可能magical_value
会被优化掉(如果您打开优化)或按原样使用(即可能不会耗尽内存)。