好的,所以我必须将一个函数增加到我的代码中,以便加载一堆数字,这些数字最终将达到我用户输入的数字的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;
}
答案 0 :(得分:0)
一旦解决了所有语法问题,您仍然无法获得所需的结果,因为预测器/校正器方法中的数学运算永远不会收敛。具体而言,fabs(in - sqrt(old_guess))
始终为>= 1e-5
,因为in
始终大于sqrt
的{{1}}。
此外,如果您使用预测器/校正器方法来计算数字的平方根,那么它将失去在迭代中使用old_guess
的目的。如果您打算使用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