繁体   English   中英

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

[英]Why is my while loop infinite?

#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=%e\n",iteration,n,r,calcError(r,n));  
}

printf("sqrt(%f)=%f to  six places\n",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)始终为true。

你有while(calcError(n,r)<1e-6)并且calcError总是返回0,所以当然你的循环将永远继续下去。 我认为您打算让calcError返回delta而不是0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM