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

本文关键字:vs 乘法 除法 计算 精度 浮点数 | 更新日期: 2023-09-27 18:10:23

我遇到了这个矢量/标量除法的实现:

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

我试着通过简单的除法来实现它:

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

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

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

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

不,这只是为了使它更快,因为乘法通常比除法快。

我应该使用乘法还是除法?

1除2乘vs 2除可能并不总是更快,但这几乎肯定是原因。

如果向量是3或更多维度,我更相信这是值得的,但总是为这些微优化配置文件。

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

请记住,浮点数的形式为(有效数*底数^指数),其中底数通常为2,有效数在底数中的位数有限,并且在区间[1,2)或[0,1)中为次法线。

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

  1. 执行精确操作(significant * 2^exp1) op (significant * 2^exp2)
  2. 根据当前有效的舍入方向将此结果舍入到最接近的可表示浮点数。

我简化了一点,因为也有异常值的处理,可编程生成的FPU异常等…

因此,操作越多,四舍五入近似的方式就越好。

由于*比/快(试着自己模拟),第一个分解逆的方法是为了提高执行速度,但肯定不是为了提高精度。

恕我冒昧,精度应该更差而不是更好,因为您有两个操作,因此有两次机会启动浮点近似值…

如果因子计算更复杂,可能是一种节省计算两次的方法,但这里甚至不是这样。