为什么这段代码,
const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8,
1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6};
const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812,
1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690};
float y[16];
for (int i = 0; i < 16; i++)
{
y[i] = x[i];
}
for (int j = 0; j < 9000000; j++)
{
for (int i = 0; i < 16; i++)
{
y[i] *= …Run Code Online (Sandbox Code Playgroud) c++ floating-point performance compilation visual-studio-2010
我注意到有很多关于浮点计算错误主题的讨论,要求你使用比复杂的更复杂的比较==.然而,所有这些文章似乎都假设值以某种方式被操纵(或双重计算),而我没有看到一个涵盖非常简单的常量复制的示例.
请考虑以下事项:
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应该在编译时设置,以便在该点进行所有舍入.之后,应该将值复制到类中,并与原始值进行比较.这样的比较是否保证安全?或者可以复制或比较在这里引入错误?
请不要建议替代比较或魔法价值使用方法,这是另一个主题.我只是对这个假设感到好奇.
编辑:请注意,我有点担心在某些体系结构上,优化可能会导致将值复制到不同大小的浮点寄存器,从而引入精确值的差异.有类似的风险吗?