test很简单:
float a= 1.0f;
float b = 1.576f;
float c = a/b;
cout << c << endl;
cout << c * b << endl;
结果:
0.634518
1
但是1/1.1576
就像0,63451776649746192893401015228426
之类的东西(肯定会有更多的数字)。
当然,舍入发生在某个时间。但是一旦这个值被截断并且再次乘以,我无论如何都可以获得原始值。
我是“幸运的”还是每次都保证这一点?
答案 0 :(得分:2)
你很幸运。您永远不应该假设浮点运算的结果具有特定值。比较时可以使用&lt;和&gt;,但如果你想检查是否相等,请使用一个小epsilon。
if (abs(a - b) < epsilon) cout << "a and b are equal" << endl;
即使你比较,根据情况,你也可能想要使用epsilon。
您可以使用std::numeric_limits<float>::epsilon()
或定义自己的。
N3337 3.9.1.8:
的价值表示 浮点类型是实现定义的
答案 1 :(得分:1)
你是(非)幸运的。这绝对不能保证。
考虑一个浮点表示,它只在尾数中有四个二进制数字的空间,并且不抑制前导数字(因为这只会使表示更复杂,而不改变参数)。
1/10 = 0.000110011...b
我们的代表将是1.100B-4
。现在乘以十(1010b
),得到1111.B-4
的扩展精度。如果您对指数进行标准化,则最终结果为1.111B-1
- 不与1.000B0
相同。
类似的论据适用于更长的精确度。如果您使用的是x86平台,则float具有23位精度(其中一个隐藏),然而内部浮点寄存器具有63位精度 - 这意味着中间值保持更多更精确。这意味着你经常不会注意到这样的问题。