gpt4 book ai didi

c++ - 如何防止sqrt溢出?

转载 作者:太空狗 更新时间:2023-10-29 20:05:49 30 4
gpt4 key购买 nike

我有密码

unsigned long long f(unsigned long long x, unsigned long long y){
return sqrt( ( (5*x*x + 1) * (5*y*y +1) - 1 ) / 4 );
}

但如果 x 或 y 太大,即使输出应该很小,也会溢出。有没有解决的办法?

最佳答案

用代数方式拆分平方根的参数,也许?:

return sqrt((3*x*x+1)/2) * sqrt((6*y*y-5)/2);

或根据您的需要进一步拆分。

如果 x 足够大,您可以忽略 +1 并生成第一项:

sqrt((3*x*x)/2) = fabs(x) * sqrt(3.0/2.0)

与第二个任期的 y 类似,使其成为

sqrt((6*y*y)/2) = fabs(y) * sqrt(3.0);

编辑:在 OP 将他的问题编辑为:

return sqrt(((3*x*x+1)*(6*y*y-5)-1)/4);  

事实上你可以把事情分开。你只需要稍微小心一点。底线是,如果 x 真的很大,那么可以忽略 +1。如果 y 真的很大,那么可以忽略 -5。如果 (3*x*x+1)(6*y*y-5) 都是正数并且都很大,那么 -1 可以忽略。您可以使用这些技巧和一些额外的周边逻辑来进一步分解它。像这样:

 if(fabs(x) > BIGNUMBER && fabs(y) > BIGNUMBER)
{
return fabs(x) * fabs(y) * sqrt(18.0/4.0);
}
if(fabs(x) > BIGNUMBER && fabs(y) > 1.0) // x big and y term positive
{
return fabs(x) * sqrt(6*y*y-5) * sqrt(3.0/2.0);
}
if(fabs(y) > BIGNUMBER) // x term positive and y big
{
return sqrt(3*x*x+1) * fabs(y) * sqrt(6.0/2.0);
}
return sqrt(((3*x*x+1)*(6*y*y-5)-1)/4);

您可以对此进行优化,但这只是为了说明这一点。

关于c++ - 如何防止sqrt溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215524/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com