使用 pow 评估指数时 NAN 但如果我迭代则正确答案?

NAN when evaluating exponential using pow but correct answer if I iterate?

当使用 cmath 库中的 pow() 时,我得到 NaN 但如果我迭代幂的长度,它有效吗?

我正在尝试评估 y=0.05*(1+-2.01655)^x,其中 90 < x < 180 并且我在使用 pow((1+-2.01655),x) 时收到 NaN 但在 for 循环中迭代可以获得正确答案?值得注意的是 excel 也表现出类似的问题(无法评估原始形式但可以评估分段形式)。

double var = -1.01655;
double final = 1;
for(int i=0 ; i<ceil(x); i++){
   final *= var;
}
final = 0.05 * final;

取一个数的小数指数意味着 n 次方根运算;例如 pow(2, 3.0 / 2.0) == sqrt(pow(2, 3)).

负数通常有虚根。 std::pow 对于双打只处理实数。 1 - 2.01655 当然是负数,所以你的等式只有 x 的整数值的真实结果。我认为您会发现 x 的整数值生成结果,非整数值生成 NaN。您的循环起作用的原因是您计算的是整数幂,而不是分数幂。

参见cppreference;关于错误处理的部分:

If base is finite and negative and exp is finite and non-integer, a domain error occurs and a range error may occur.