基本上是一个性能相关的问题:
我只想从双除法中获取整数商,例如,对于除法 88.3/12.7 = 6.9527559055118110236220472440945
,我只想得到“6”作为结果。
一个可能的实现当然是:floor(x/y)
,但是在这里,首先完成了性能密集型双除法,然后 floor 丢弃了双除法所做的大部分“工作”。
所以基本上我想要一个带 double 的除法,它在计算所有这些小数点之前“停止”,只给我除法的正确整数结果,而不舍入或截断初始 double 参数。有谁知道这个的优雅实现(我搜索了这个主题但没有找到太多)?
我能想到的另一个实现是:
整数(x*1000)/整数(y*1000)
可以使用所需的“精度”而不是 1000。一个非常简单的实现也是简单地从 x 中减去 y,直到结果小于零。但是,是的,我想知道最好的方法是什么。
此外,简单地执行 int(x)/int(y)
是不可取的,因为它很容易导致错误的结果。
顺便说一下,我知道这可能又是这些“微优化”问题之一,这些问题处理的问题在新机器上并不重要,但是,我仍然对这个主题很好奇! :-)
最佳答案
没有办法提前停止,使用整数除法可能会更慢。
例如,在 Skylake 上:
idiv r/m32 L: 26-27 T: 6
divsd xmm, xmm L: 13-14 T: 4
( source )
所以双除法的速度是原来的两倍,吞吐量也明显更好。那是在您考虑额外的乘法和额外的转换之前。
在较旧的 µarchs 上,32 位整数除法通常比双除法具有更低的延迟数字,但是它们变化更大(除法过去更串行),(对于 float )圆形除数更快但是对于整数除法,小的结果更快。这种特征上的差异可以使它左右摇摆,具体取决于您除以什么。
如您所见,在这种情况下,在没有特定目标的情况下进行优化是危险的,但我认为较新的机器比旧机器更有可能成为目标,这意味着双除法或多或少是您可以做的最好的事情(除非其他优化适用)。划分单精度 float 本身速度更快,但会产生转换成本,如果将它们相加,它实际上最终会损失 (5+10)。
关于c++ - 停止小数点前的双除法(低精度,快速除法;只得到 'quotient' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41981021/