-3

私のコードは次のように正常に動作します:(1、-2、-8)、a = 1 b = 0 c = 1と入力すると、上記のエラーが発生します。

これが私のコードです:

    double x=0,a=0,b=0,c=0,d=0;
    complexType solu1;
    complexType solu2;


    cout << "\n\nEnter values of quadratic a,b,c:";
    cin >> a >> b >> c;

    double solution1 = (-1.0 * b) + (sqrt((b * b) - (4 * a * c)));
    solu1 = solution1 / (2*a);

    cout << setprecision(5) << solu1;

    double solution2 = (-b) - (sqrt((b*b) - (4 * a * c)));
    solu2 = solution2 / (2*a);
    cout << setw(5) << setprecision(5)  << solu2;

どうすればこれを修正できますか?

4

2 に答える 2

3

の実際の解決策を見つけようとしていますがx^2 + 1 = 0、これには架空の解決策しかありません。

すべての2次方程式を解く場合は、判別式が正であるかどうかを確認して、解が実数であるか複素数であるかを判断する必要があります。

double d = b*b - 4*a*c;
if (d >= 0) {
    double sol1 = (-b + sqrt(d))/(2*a);
    double sol2 = (-b - sqrt(d))/(2*a);
    std::cout << sol1 << ", " << sol2 << '\n';
} else {
    double real = -b/(2*a);
    double imag = sqrt(-d)/(2*a);
    std::cout << real << " +/- " << imag << "i\n";
}

あなたが望むなら、あなたはもっときちんとした何かをすることができますstd::complex

于 2011-10-13T18:05:40.867 に答える
1

sqrt((b*b) - (4 * a * c))入力はsqrt(-4)です。http://www.cplusplus.com/reference/clibrary/cmath/sqrt/によるとIf the argument is negative, a domain error occurs, setting the global variable errno to the value EDOM. 、その場合に返されるものの定義がわかりません。いずれにせよ、それは間違っています。

コードに含まれているcomplexTypeようです。それがのtypedefであるstd::complex<T>場合、コードは簡単に修正できます。

complexType top = b*b - 4*a*c;
solu1 = (-b + sqrt(top)) / (2*a);
solu2 = (-b - sqrt(top)) / (2*a);

std::sqrtのオーバーロードがあるのでstd::complex<T>

于 2011-10-13T18:07:18.063 に答える