Math 浮点的编译器最优除法

Math 浮点的编译器最优除法,math,optimization,division,Math,Optimization,Division,我写了一个函数来影响控件的感觉,发现除以15.9是正确的。我的本能是将其改为除以16,因为编译器可以将其优化为移位操作。然而,在这种情况下,该值是一个浮点值。浮点除法中有最优除数吗?将浮点除以16也很容易。你只要把指数减4。但我不认为编译器在这里做任何优化,因为这样它还必须检查下溢 明确地说:我不打算直接操纵指数位。我只是想指出,float的潜在最快除数也是二的幂。为什么不乘以0.0628930818呢?如果除以15.9是“大致正确”,那么乘以倒数(尽管可能不完全精确到最后一个小数点)仍然是“大

我写了一个函数来影响控件的感觉,发现除以15.9是正确的。我的本能是将其改为除以16,因为编译器可以将其优化为移位操作。然而,在这种情况下,该值是一个浮点值。浮点除法中有最优除数吗?

将浮点除以16也很容易。你只要把指数减4。但我不认为编译器在这里做任何优化,因为这样它还必须检查下溢


明确地说:我不打算直接操纵指数位。我只是想指出,
float
的潜在最快除数也是二的幂。

为什么不乘以0.0628930818呢?如果除以15.9是“大致正确”,那么乘以倒数(尽管可能不完全精确到最后一个小数点)仍然是“大致正确”。如果使用了一些“许可数学”标志,优化编译器甚至可能会自动执行此操作(通常,这是严格不允许的,因为它可能会丢失一些精度)


无论如何,它比除以16更准确。而且,它不像篡改指数位那样是一种黑客行为。

嗨,Henrik,我也想到了这一点,但由于它会丢掉精度,我认为编译器不会这样做。只要你有足够的二次幂远离底流,这种方法是快速、安全的,并且不会丢失精度(或者你所说的“丢掉精度”)。当然,问题是指数——最小的指数——是否总是足够大,这样就不会出现下溢。我对这项工作的准确性不感兴趣。当用户转动控件时,我正在调整一个值,该值用于加速度计算。值为15或17也同样有效。我不认为在处理器中,除以或乘以倒数之间有多大区别。我对修改浮点的内部结构也不感兴趣,我只是想知道如果我保存机器周期,我是否会选择一个好的除数。乘法与加法或减法大致相同,在主流桌面CPU上通常是3-4个周期,而除法大约是40个周期。到目前为止,如果不需要完美的精度(不管怎样,它的精度是99.9%),但节省机器周期是必要的,我肯定会乘以倒数。另一方面,使用值(例如16.0)没有任何好处,因为使用浮点数学不会更快,其他任何东西(转换为定点和移位,篡改指数位等)都会非常非常昂贵。在SSE中,如果不安全地篡改指数,那么篡改指数的速度会非常快,由于15.9及其倒数都不能表示,因此关于准确性的讨论归结为一个是否能比另一个更准确地表示。在这种情况下,除法的10倍执行时间可能是使用倒数和乘法的决定因素。