[英]Program for finding square root of number
所以我写了一个程序来找到一个数字的平方。 对于较小的数字,它似乎工作正常,但对于长数字,它会产生奇怪的结果。 这是我的代码。
int SquareRoot(long x)
{
long start=1;
long end=x;
long mid;
while(start<end)
{
mid=start+(end-start+1)/2;
if(mid*mid<x)
{
if((mid+1)*(mid+1)>x)
{
return mid;
}
start=mid;
}
else if(mid*mid>x)
{
if((mid-1)*(mid-1<x)
return mid-1;
end=mid;
}
else
return mid;
}
return start;
}
当计算mid * mid
和(mid + 1) * (mid + 1)
一个或两个溢出时,您观察到的“奇怪结果”可能会发生,当end
大于2*sqrt(LONG_MAX)
(大约 6,074,000,998 2*sqrt(LONG_MAX)
时会发生这种情况如果long
是 64 位,或者 92680 如果long
是 32 位)。
溢出将导致与x
的比较产生错误的结果(从技术上讲,溢出会产生未定义的行为,尽管使用 gcc 结果是可预测的但不正确)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.