为什么我的while循环是无限的

Why is my while loop infinite?

本文关键字:无限 循环 我的 while 为什么      更新时间:2023-10-16
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc != 2) {
    printf("Too many arguments.n", argc );
return 1;
}
double n;
n = atof(argv[1]);
if (n<0) {
    printf("Negative argument.n");
return 1;
}
double r;
r = n;
int iteration;
iteration = 0;
while(calcError(n,r)<1e-6) {
    iteration = iteration +1;
    r = (r + n/r)/2;
    printf("  %d. sqrt(%f)~= %f,error=%en",iteration,n,r,calcError(r,n));  
}
printf("sqrt(%f)=%f to  six placesn",n,r); 
return 0;
}
int calcError (double n, double r) {
double delta;
delta = n-r*r;
delta = delta > 0 ? delta : -delta;
return 0;
}

运行此代码会生成一个无限的 while 循环。我还收到一条警告:格式"%e"需要类型为"double"的参数,但参数 5 的类型为"int" [-Wformat]。这是为什么呢?

calcError总是返回0 ,所以

while(calcError(n,r)<1e-6)

和一样好

while(0 < 1e-6)

while(true)

至于警告,编译器准确地说出了什么问题:calcError返回一个int,但你提供的格式字符串(%e(需要一个double。这将产生未定义的行为。按如下所示更改返回类型将解决此问题。

查看您的代码,我认为只要错误大于 1e-6 就想循环。如果正确,您可能需要将calcError修改为如下所示:

int calcError (double n, double r)
{
    double delta;
    delta = n-r*r;
    delta = delta > 0 ? delta : -delta;
    return delta;
}

可以缩短为

double calcError(double n, double r)
{
    return fabs(n-r*r);
}

并将循环的条件更改为循环,直到它变小:

while(calcError(n,r) > 1e-6)

在你的calcError()函数中,你有,

return 0;

所以在你的表达式中,calcError()将永远为零。

而且,(0 < 1e-6)总是正确的。

你有while(calcError(n,r)<1e-6)calcError总是返回0,所以当然你的循环会永远持续下去。我想你的意思是让calcError返回delta而不是0.