我遇到过这个矢量/标量划分实现:
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);
}
我尝试运行模拟,结果似乎略有不同。
这是一种提高计算精度的技巧吗?
答案 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)就像使用此算法产生的那样:
我简化了一下,因为还有处理异常值,可编程生成FPU异常等等......
所以,操作越多,就越接近四边形。
由于*比/更快(尝试自己模拟),因此第一个将反向分解的是提高执行速度,但肯定不会提高精度。
答案 2 :(得分:2)
恕我直言,精度应该更差而不是更好,因为你有两个操作,因此有两个机会让浮点近似值开始......
如果因子计算更复杂,它可能是一种节省计算两次的方法,但在这里情况并非如此。