为什么我的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=%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
.
相关文章:
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 从文件 C++ 读取时的无限循环
- 试图找出为什么我的代码保持无限循环