求开平方时遇到的溢出问题。

本文探讨了在实现求开平方函数时可能遇到的溢出问题,通过示例代码解释了如何避免溢出错误。核心在于限制二分搜索范围,以防止中间结果超过int类型的最大值导致负数溢出。同时还测试了不同数据类型在乘法运算时的溢出行为。
  
   bool isPerfectSquare(int num) {
        if(num<2) return true;
        if(num==2) return false;
        int mid=0;
        int j= min(num, 46341);
        for(int i=1;i<=j;){
            mid=(i+j)/2;
            if(mid*mid==num)  return true;
            else if(mid*mid<num)   i=mid+1;
            else  j=mid-1;
        }
        return false;
    }
这是一个开平方的函数。红色这一条指令是必加的。
因为 我的解题思路是用二分的方式来寻找。

为什么加?
sqrt(int_max) =46430.95
因为int_max 的开平方小于46431,所以我们可以直接从(1,46431)之中找num的开平值。
如果不加会怎么样?
如果第一个二分值mid=(1+num)/2 大于46341 的话,mid*mid 会发生溢出变成负数。从而产生错误。
**因为mid*mid产生的是一个临时变量,是否发生溢出跟mid 自身的变量类型有关,上面是int类型 32位 会发生溢出。

下面是对各种类型的测试。 立即数是跟32位有关,这个是跟编译器有关。
                                              而有变量类型的产生的临时变量还是原本的临时变量。
int64_t t1=46431;
       cout<<"int_64 "<< t1*t1<<endl;
       int32_t t2=46431;
       cout<<"int_32 " <<t2*t2<<endl;
       double t3=46431;
       cout<<"double "<< t3*t3<<endl;
       cout<<"无类型 " <<46431*46431<<endl;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值