gpt4 book ai didi

c - C 程序执行卡住

转载 作者:行者123 更新时间:2023-11-30 18:35:33 25 4
gpt4 key购买 nike

我正在用 C 解决一个简单的问题集来设计一个二次方程求解程序,但由于某种原因我无法让它工作。我尝试过处理每个部分并将它们拉入自己的程序中以测试它们的执行情况,并且它们似乎单独工作,但是当我执行程序时,它被卡住了。如有任何帮助,我们将不胜感激!

//A program to solve a quadratic equation
#include <stdio.h>

float absoluteValue (float x)
{
if (x < 0)
x = -x;
return (x);
}

float squareRoot (float x)
{
const float epsilon = .00001;
float guess = 1.0;

while (absoluteValue (guess * guess - x) >= epsilon )
guess = (x / guess + guess) / 2.0;
return guess;
}

float quadraticEquation (float a, float b, float c)
{
float rootOne, rootTwo;

if ((b * b - 4 * a * c) <= 0) {
printf ("The roots are imaginary.");
}
else {
rootOne = (-b + squareRoot(b * b - 4 * a * c)) / (2 * a);
rootTwo = (-b - squareRoot(b * b - 4 * a * c)) / (2 * a);
}

return 0;

}

int main (void)
{
float a, b, c;
a = 10;
b = 30;
c = 5;

// printf ("Please enter a value fo A, B, and C: \n");
// scanf ("%f%f%f", &a, &b, &c);
quadraticEquation(a, b, c);

return 0;
}

最佳答案

当您的程序陷入循环时,找出其发生位置的最佳方法是在调试器中运行程序,让它陷入循环,然后暂停调试器。在 GDB 或 LLDB 中,可以通过键入 Control-C 来完成此操作,但在其他调试器中,UI 可能有所不同(在基于 GUI 的 IDE 中,可能会有一个可以单击的按钮);但是,每个调试器都应该具有暂停功能。这将使调试器准确地向您显示卡住时的执行位置,从而使您能够快速确定问题所在。

无论如何,在这种情况下,导致无限循环的行是:

while (absoluteValue (guess * guess - x) >= epsilon )
guess = (x / guess + guess) / 2.0;

通过单步执行并使用调试器分析变量的内容,卡住点的执行是:

x 是 700。

猜测是 26.4575119,距离 700 的平方根不远。

guess *guess - x 为 -0.0000610351563,其绝对值大于 epsilon,即 0.00001。

然后将

guess 设置为 (x/guess +guess)/2.0 的值,结果为 26.4575119。不幸的是,这与 guess 已经具有的值相同,因此循环将永远持续下去。

基本上,浮点不精确导致您的结果永远无法达到正确答案的epsilon范围内。您可以调整您的算法来解决此问题,但除非这是为了某些要求您不使用除 stdio 或其他内容之外的任何内容的作业,否则我建议您查看 math.h,其中包含sqrt 函数将为您计算平方根,而不是您自己重新发明轮子。

关于c - C 程序执行卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126346/

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