【发布时间】:2017-02-01 13:28:36
【问题描述】:
基本上是一个与性能相关的问题:
我只想从双除法中得到整数商,例如,对于除法88.3/12.7 = 6.9527559055118110236220472440945,我只想得到“6”作为结果。
一个可能的实现当然是:floor(x/y),但在这里,首先完成了性能密集型双除法,然后 floor 丢弃了双除法所做的大部分“工作”。
所以基本上我想要一个双精度除法,它在计算所有这些小数点之前“停止”,只给我正确的除法整数结果,而不用舍入或截断初始双精度参数。有谁知道这个的优雅实现(我搜索了这个主题但没有找到太多)?
我能想象的另一个实现是:
int(x*1000)/int(y*1000)
可以使用所需的“精度”而不是 1000。一个非常简单的实现也是简单地从 x 中减去 y,直到结果小于零。但是,是的,我想知道最好的方法是什么。
另外,简单地使用int(x)/int(y) 是不行的,因为它很容易导致错误的结果。
顺便说一句,我知道这可能又是这些“微优化”问题之一,它处理一个在新机器上并不重要的问题,但是,我仍然对这个主题有点好奇! :-)
【问题讨论】:
-
整数和浮点除法时间相同。 32 位除法比 64 位除法快。如果分母足够有限,您可以使用查找表来获得倒数,那么乘法会快得多。
-
问题是你不能真的只做除法的“一部分”来获得非小数。至少我是这么认为的,因为我不擅长高等数学。除非您绝对想要代码,否则也许可以在 math.stackexchange.com 上询问如何仅获得除法的非小数部分?
标签: c++ performance division