gpt4 book ai didi

C程序,我一辈子都搞不懂

转载 作者:行者123 更新时间:2023-11-30 21:06:55 26 4
gpt4 key购买 nike

好吧,所以我必须在我的代码中增加一个函数,以使其加载一堆数字,这些数字最终将达到用户输入的数字的 sqrt,所有这些都是通过使用 while 循环来实现的。问题是,数字不会进入函数,并且它会无限循环,因为永远不会达到 false。有什么帮助吗?

#include <stdio.h>
#include <math.h>

int main(void)
{
double in, out, var, new_guess, old_guess;

printf("Enter a number: ");
scanf("%lf", &in);

while(fabs(in - sqrt(old_guess)) >= 1e-5) {
new_guess = (old_guess + (in / old_guess)) / 2.0;
printf("%11.5lf", old_guess);
}
printf("Estimated square root of %11.5lf: %11.5lf\n", in, new_guess);

return 0;
}

最佳答案

一旦解决了所有语法问题,您仍然无法获得所需的结果,因为预测器/校正器方法中的数学永远不会收敛。具体来说,fabs(in - sqrt(old_guess)) 将始终为 >= 1e-5,因为 in 将始终大于 old_guess 的 >sqrt

此外,如果您使用预测器/校正器方法来计算数字的平方根,则它会违背在迭代中使用 sqrt 的目的。如果您要使用 sqrt 函数来查找答案,您可以简单地执行以下操作:

double answer = sqrt (in);   /* problem solved */

迭代方法的目的是通过使用速率或平均差来重复优化您的猜测,直到它满足某些条件(例如重复项之间的误差容限)(您似乎在此处尝试这样做)来收敛于解决方案)

要使用您尝试使用的方法迭代查找数字的平方根,您首先要查找用户输入的数字的下一个较低或较高的完全平方。从 1 开始并递增 x 直到 x * x 不再小于 in 的简单暴力是很好。

然后,您将输入除以完全平方数来预测答案,然后将输入的平均值除以预测答案加上预测答案,以纠正术语之间的错误(和重复直到达到您的容错能力)

注意您还应该包含迭代限制,以防止您的解决方案由于某种原因未收敛而出现无限循环。

总而言之,你可以做类似的事情:

#include <stdio.h>
#include <math.h>

#define ILIM 64 /* max iteration limit */
#define TOL 1e-5 /* tolerance */

int main(void)
{
double in, n = 0, new_guess, old_guess, root = 1;

printf ("Enter a number: ");
if (scanf ("%lf", &in) != 1) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}

while (root * root < in) /* find next larger perfect square */
root++;

/* compute initial old/new_guess */
old_guess = (in / root + root) / 2.0;
new_guess = (in / old_guess + old_guess) / 2.0;

/* compare old/new_guess, repeat until limit or tolerance met */
while (n++ < ILIM && fabs (new_guess - old_guess) >= TOL) {
old_guess = new_guess;
new_guess = (in / old_guess + old_guess) / 2.0;
}

printf ("Estimated square root of %.5f: %.5f\n", in, new_guess);
printf ("Actual : %.5f\n", sqrt (in));

return 0;
}

(注意: sqrt 仅用于提供与迭代解决方案的比较)

示例使用/输出

$ ./bin/sqrthelp
Enter a number: 9
Estimated square root of 9.00000: 3.00000
Actual : 3.00000

$ ./bin/sqrthelp
Enter a number: 9.6
Estimated square root of 9.60000: 3.09839
Actual : 3.09839

$ ./bin/sqrthelp
Enter a number: 10
Estimated square root of 10.00000: 3.16228
Actual : 3.16228

$ ./bin/sqrthelp
Enter a number: 24
Estimated square root of 24.00000: 4.89898
Actual : 4.89898

$ ./bin/sqrthelp
Enter a number: 25
Estimated square root of 25.00000: 5.00000
Actual : 5.00000

$ ./bin/sqrthelp
Enter a number: 30
Estimated square root of 30.00000: 5.47723
Actual : 5.47723

关于C程序,我一辈子都搞不懂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46461276/

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