#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ループが無限に生成されます。 format '%e'は 'double'型の引数を期待していますが、引数5は 'int' [-Wformat]の型を持っています。どうしてこれなの?なぜwhileループが無限ですか?
ありがとうございました。ただし、その変更でコードを実行すると、同じ警告が生成されます。もはや無限ループではなく、whileループを完全にバイパスして次のように表示します:sqrt(24.000000)= 24.000000 to six places – normystar
エラーがあなたのイプシロンより大きい限りループしたいと思います。これは:while(calcError(n、r)> 1e-6) ' – krzaq
私はかなり[this](http://melpon.org/wandbox/permlink/Oqw54hodZugBWEnn)があなたの望むものであると確信しています。ちなみに、 'printf'に対する' calcError'の呼び出しには逆の引数があります。 – krzaq