浮点数的x / a是否与x *(1 / a)相同?

时间:2014-03-26 14:33:55

标签: c++ c floating-point

float a = ...;float inva = 1/a; x / ax * inva相同吗?

这种情况是什么:

unsigned i = ...;
float v1 = static_cast<float>(i) / 4294967295.0f;
float scl = 1.0f / 4294967295.0f;
float v2 = static_cast<float>(i) * scl;

对于所有无符号整数,v1是否等于v2

2 个答案:

答案 0 :(得分:7)

  对于所有无符号整数,

v1等于v2

是的,因为4294967295.0f是两个人的力量。当除数是2的幂时,除以除数和除数是等价的(假设倒数的计算不溢出或下溢到零)。

除数的除法和乘法一般不等同,仅在2的幂的特定情况下。原因是对于两个y的(几乎所有)幂,1 / y的计算是精确的,因此x * (1 / y)只会舍入一次,就像x / y仅轮次一次

答案 1 :(得分:5)

不,结果并不总是一样的。在这种情况下,在浮点乘法或除法中对操作数进行分组的方式会影响答案的数值准确性。因此,产品a*(1/b)可能与a/b不同。查看维基百科文章http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems