C 查找无SQRT函数循环故障的平方根

C++ Finding square root without sqrt function loop glitching

本文关键字:故障 平方根 循环 函数 查找 SQRT      更新时间:2023-10-16

,所以我将其作为家庭作业。我知道有很多方法可以使该代码更有效,更准确,但这是我的教授想要完成的方式。

我在循环方面有问题。当我要求67的平方根时,它确实找到了它,但它会循环正确的答案3次。

Enter a value to be square rooted: 
67
33.5
guess = 17.75
guess = 10.7623
guess = 8.49387
guess = 8.19096
guess = 8.18535
guess = 8.18535
guess = 8.18535
The program took 7 guess to find an estimation. 

当我尝试找到5的平方根时,它会找到它,但继续无限地循环

using namespace std;
int main()
{
double guess2;
double squarenumber;
double guess1;
int numofguess = 0;
cout << "Enter a value to be square rooted: " << endl;
cin >> squarenumber;
guess1 = squarenumber/2;
cout << guess1 << endl;
do 
{
guess2 = (guess1 - (((guess1 * guess1) - squarenumber)/(2* guess1)));
guess1 = guess2;
cout << "guess = " << guess2 << endl;
numofguess = numofguess + 1;
} while ((guess2 * guess2) > squarenumber);
cout<< "The program took "<< numofguess <<" guess to find an estimation.";
return 0;
}

我认为您缺少的是适当的退出条件。您的代码被编写为无限期的循环,直到猜测是"完美的"。您应该有一个退出条件检查当前猜测是否与以前的猜测相同,这显然意味着您不会做得更好。这是我根据您的代码的建议:

using namespace std;
int main()
{
double guess2;
double squarenumber;
double guess1;
int numofguess = 0;
cout << "Enter a value to be square rooted: " << endl;
cin >> squarenumber;
guess2 = guess1 = squarenumber/2;
cout << guess1 << endl;
const double epsilon = squarenumber * 1E-6;
do 
{
 guess1 = guess2;
guess2 = (guess1 - (((guess1 * guess1) - squarenumber)/(2* guess1)));

cout << "guess = " << guess2 << endl;
numofguess = numofguess + 1;
} while ((guess2 * guess2) > squarenumber && fabs(guess2-guess1) > epsilon);
cout<< "The program took "<< numofguess <<" guess to find an estimation.";
return 0;
}

mickaëlC。Guimarães的答案基本上是正确的,请检查一个情节值(与正确的答案和您的答案绝对差异)。但是"(猜测 *猜测2)> SquareNumber应该完全删除。那是因为从理论上讲,价值可能会超过且太低。如果值太低,则该算法实际上会向上。例如如果您想要SQRT(25)和您的"猜测"预测在2时太低,那么猜测2将等于

(2 - (((2 * 2) - 25)/(2* 2))) = 7.25;

然后,在下一次迭代中,跌至6.725624,因此朝正确的方向前进。低值实际上会增加并最终接近目标。通过停止值,如果该值降至真实的SQRT以下,那么您可能会得到"误报",其中太低的值就足够准确。

系统被"卡住"的时代基本上就像故事附近和乌龟一样。在每个步骤中,系统都在将剩余距离划分为一定数量,但是更改的每个步骤都较小,理论上可以选择确切的值,因此您决定要多于准确性,以便它完成设定的时间。

此外,系统似乎采取太多步骤进行收敛的问题是因为浮点数数量更高,但是COUT的显示精度有限。您可以通过在打印命令之前将设置值发送到Cout来控制它:

std::cout << std::fixed; // force all values to show to the same decimals
std::cout << std::setprecision(6); // set how many places to show

这些代码也可以在要打印的值之前将其流到一个命令中:

std::cout << std::fixed << std::setprecision(6) << "guess = " << guess2 << endl;