c++ - 停止小数点前的双除法(低精度,快速除法;只得到 'quotient' )

标签 c++ performance division

基本上是一个性能相关的问题:

我只想从双除法中获取整数商,例如,对于除法 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/

相关文章:

c++ - 之前缺少模板参数

c++ - 输入两个数字后程序关闭

java - 在对我的 Java 应用程序进行基准测试时,如何补偿没有 "quiet"机器的情况?

java - 禁用时 Java 断言的性能拖累

c++ - 使函数内联会影响它的链接吗?

c++ - 删除 float 最后一位的问题

c++ - 为什么 MATLAB/Octave 在特征值问题中用 C++ 擦地板?

java - 更改 JSlider 的可显示标签?

javascript - 使用 Jquery 或 Javascript 动态计算字段的划分

C++ 通过位移位和减法除法无法正常工作