通过 1/3 的小数指数提高 double 时获得 NaN 值
Getting NaN value when raising double by a fractional exponent of 1/3
我是 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
的值:
当我在 Desmos 中将此值提高到 1/3
时,我得到 -0.853432944643
。
我不是在对负数求平方根(它是 1/3
而不是 1/2
)所以我为什么会遇到这个问题?
干杯,
汤姆
pow
不支持以这种方式求负数的根。
std::pow 上的 cppreference:
Error handling
Errors are reported as specified in math_errhandling.
If base is finite and negative and exp is finite and non-integer, a domain error occurs and a range error may occur.
C++提供了直接计算立方根的函数,std::cbrt:
std::cbrt(first_half);
这意味着您无需担心 first_half
最终会成为什么符号,以避免域错误。
我是 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
的值:
当我在 Desmos 中将此值提高到 1/3
时,我得到 -0.853432944643
。
我不是在对负数求平方根(它是 1/3
而不是 1/2
)所以我为什么会遇到这个问题?
干杯,
汤姆
pow
不支持以这种方式求负数的根。
std::pow 上的 cppreference:
Error handling
Errors are reported as specified in math_errhandling.
If base is finite and negative and exp is finite and non-integer, a domain error occurs and a range error may occur.
C++提供了直接计算立方根的函数,std::cbrt:
std::cbrt(first_half);
这意味着您无需担心 first_half
最终会成为什么符号,以避免域错误。