0

プログラム内の一見無限の入力ループについて簡単な質問がありました。while ループで発生していると確信しており、それが私の数学またはコーディングによるものかどうか疑問に思っています。ループは私にとってまだ新しいものなので、助けや説明があればいいのにと思います! このプログラムは、ニュートン法を使用して z の p 乗根、残差、およびループ間の改善を求めるプログラムの始まりです。また、私の目的には for ループの方が適しているのではないかと考えていました。ここまでです:

#include <iostream>
#include <cmath>

using namespace std;

double Newton(double z, int p, double &x, double &n);

int main(){
    double z, x, n, residual, bai, bri;
    int p;
    x = 1;
    n = 1;
    cin >> z >> p;
    double roots = Newton(z, p, x, n);
    cout.precision (5);
    cout << "Input: z = " << z << ", p = " << p << endl << "Root = " << x << endl;
}

double Newton(double z, int p, double &x, double &n){
    x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
    while (x != 0){
            x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
            n++;
    }
    return x;
}
4

2 に答える 2

2

一般に、浮動小数点演算との等価性をテストすることはお勧めできません。あなたの数学やコーディングに問題がないかどうかはわかりませんが、その可能性が完全xにゼロになることは決してないと思います。のようなものに変更することを検討してくださいwhile (fabs(x) < 1e-10)

于 2013-09-26T00:10:36.173 に答える