我是 C 的新手,所以如果有一個快速解決這個問題的方法,請在評論中告訴我。
我正在研究三次多項式方程求解器應用程式,為此我需要將某個雙精度值除以分數指數,在本例中為1/3.
這是到目前為止的代碼:
#include <iostream>
#include <valarray>
#include <vector>
#include <iomanip>
using namespace std;
void solveEquation(double a, double b, double c, double d);
int main() {
double a, b, c, d;
cout << "Input a value for 'a': " << endl;
cin >> a;
cout << "Input a value for 'b': " << endl;
cin >> b;
cout << "Input a value for 'c': " << endl;
cin >> c;
cout << "Input a value for 'd': " << endl;
cin >> d;
solveEquation(a, b, c, d);
return 0;
}
void solveEquation(double a, double b, double c, double d) {
vector<double> frac_vector1{((pow(-b, 3)) / (27 * pow(a, 3))),
((b * c) / (6 * pow(a, 2))),
-(d / (2 * a))};
double frac_vector1_result = 0;
for (double frac : frac_vector1) {
frac_vector1_result = frac;
}
double frac_vector1_result_pow = pow(frac_vector1_result, 2);
vector<double> frac_vector2 {(c/(3 * a)),
-((pow(b, 2))/(9 * pow(2, a)))};
double frac_vector2_result = 0;
for (double frac : frac_vector2) {
frac_vector2_result = frac;
}
double frac_vector2_result_pow3 = pow(frac_vector2_result, 3);
double first_half = (frac_vector1_result sqrt(frac_vector1_result_pow frac_vector2_result_pow3));
cout << pow(first_half, 1.0/3.0); //isNan ?
}
當我輸入時,a = -0.71, b = -0.3, c = 2.2, and d = -1.46我得到一個 NaN 值,這不是我在計算器中得到的值。
當我除錯它時,我得到以下值first_half:

當我1/3在 Desmos 中將此值提高到-0.853432944643.
這不像我在平方根一個負數(它1/3不是1/2)那么為什么我會遇到這個問題?
干杯,
湯姆
uj5u.com熱心網友回復:
pow 不支持以這種方式求負數的根。
std::pow上的 cppreference :
錯誤處理
錯誤按math_errhandling 中指定的方式報告。
如果 base 是有限的負數,exp 是有限的非整數,就會出現域錯誤,可能會出現范圍錯誤。
C 提供了一個直接計算立方根的函式,std::cbrt:
std::cbrt(first_half);
這意味著您無需擔心first_half最終會出現什么標志以避免域錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312884.html
上一篇:用C語言改變計數
