使用 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.
当使用 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.