为什么我的while循环无限?

时间:2016-09-27 01:16:43

标签: c++ c function while-loop warnings

#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;

}

运行此代码会生成无限循环。我还得到一个警告:格式&#39;%e&#39;期望类型&#39; double&#39;的参数,但参数5具有类型&#39; int&#39; [-Wformat]。这是为什么?

3 个答案:

答案 0 :(得分:4)

calcError始终返回0,所以

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

一样好
while(0 < 1e-6)

while(true)

至于警告,编译器确切地说出错误:calcError返回int,但您提供的格式字符串(%e)需要double 1}}。这将产生未定义的行为。如下更改返回类型将解决此问题。

查看您的代码,我认为只要错误大于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)

答案 1 :(得分:0)

calcError()功能中,您有,

return 0;

因此,在您的表达式中,calcError()将始终为零。

和,(0 < 1e-6)始终为真。

答案 2 :(得分:0)

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