整数乘法和除法之间意外的明显性能差异

Posted

技术标签:

【中文标题】整数乘法和除法之间意外的明显性能差异【英文标题】:Unexpected apparent performance difference between integer multiplication and division 【发布时间】:2014-04-09 07:56:39 【问题描述】:

我正在实现一个简单的二进制搜索来查找整数的平方根。代码运行正确。但是,如果我将if 中的条件从mid * mid > x 更改为mid > (x / mid),那么大输入似乎会超时,那么一切都很好。

int sqrt(int x) 
    if(x < 0) return -1;
    if(x <= 1) return x;
    int l,r,mid,ans;
    l = 0;
    r = x;
    while(l <=r )
        mid = (l + r) / 2;

        if((mid * mid) == x) return mid;

        if((mid * mid) > x )  //<===== here if I change to mid > (x / mid)
            r = mid - 1;

        else
            l = mid + 1;
            ans = mid;
        
    

    return ans;

;

因此我得出结论,除法比乘法快。但到目前为止我所做的研究都表明乘法比除法更快。

【问题讨论】:

Should I use multiplication or division? 的可能重复项 我不同意这种重复,因为这更多地是关于浮点运算,而这种情况是整数运算。我还编辑了标题以反映这一点。 OP,如果您不同意,请回滚。 你在不到一分钟的时间内投了反对票,你真的看懂了我的问题吗? @Bathsheba:是的,我同意,我担心没有人会因为投反对票而回答我的问题,谢谢。 我最后编辑了它。两个答案(在我撰写本文时)是正确的。 【参考方案1】:
mid > (x / mid) 

优于

(mid * mid) > x

因为你避免了整数溢出。

【讨论】:

非常感谢,我太傻了,没想到,错误一直说“超出时间限制”,我只是一直在考虑速度。【参考方案2】:

大输入的问题是mid * mid &gt; x可能会溢出整数,然后二进制可能会进入一个非常奇怪的状态。在这种情况下,您也可能会得到正确的值,但这有点纯粹是运气。另一方面,使用除法可以避免整数溢出。

【讨论】:

非常感谢您的回答,我只能接受一个答案。既然你的声望更高,我会接受另一个人:)

以上是关于整数乘法和除法之间意外的明显性能差异的主要内容,如果未能解决你的问题,请参考以下文章

python中整数除法和float到int转换之间存在差异的原因是啥?

一个基础而奇怪的问题:算法执行加法乘法除法性能无区别?

numpy数组中元素的乘法和除法给出整数结果

仅使用加法、乘法、减法和最大值的整数除法

在java中不使用乘法,除法和mod运算符将两个整数相除

在java中不使用乘法,除法和mod运算符来除以两个整数