浮点数计算精度:除法与乘法

时间:2014-06-26 22:03:13

标签: c# .net math floating-point floating-point-precision

我遇到过这个矢量/标量划分实现:

public static Vector2 operator /(Vector2 value1, float divider)
{
    float factor = 1 / divider;
    value1.X *= factor;
    value1.Y *= factor;
    return value1;
}

我尝试通过简单的divison实现它:

public static Vector2 operator /(Vector2 value1, float divider)
{
    return new Vector2(value1.X / divider, value1.Y / divider);
}

我尝试运行模拟,结果似乎略有不同。

这是一种提高计算精度的技巧吗?

3 个答案:

答案 0 :(得分:10)

不,这只是为了让它更快,因为乘法通常比分频更快。

Should I use multiplication or division?

1分和2分乘以2分可能并不总是更快,但几乎可以肯定。

如果向量是3维或更多维度,我会更加确信它是值得的,但总是对这些微观优化进行描述。

额外操作的舍入错误导致不同的结果。

答案 1 :(得分:4)

请记住,浮点的格式为:significand * base ^ exponent,其中base通常为2,而有效数字在基数中的位数有限,并且在区间[1,2]或[0 ,1)对于次正规。

根据IEEE 754标准,每个浮点运算(至少+ - * / fmod余数sqrt)就像使用此算法产生的那样:

  1. 执行精确操作(有效数字1 * 2 ^ exp1)op(有效数字2 * 2 ^ exp2)
  2. 根据当前有效的舍入方向将此精确结果舍入到最接近的可表示浮点数。
  3. 我简化了一下,因为还有处理异常值,可编程生成FPU异常等等......

    所以,操作越多,就越接近四边形。

    由于*比/更快(尝试自己模拟),因此第一个将反向分解的是提高执行速度,但肯定不会提高精度。

答案 2 :(得分:2)

恕我直言,精度应该更差而不是更好,因为你有两个操作,因此有两个机会让浮点近似值开始......

如果因子计算更复杂,它可能是一种节省计算两次的方法,但在这里情况并非如此。