为什么 -0.x^0.x -nan(ind)

Why is -0.x^0.x -nan(ind)

我的程序由于某种原因出现故障,我发现这是因为我有一个计算归结为 pow(-0.2, 0.2),当它被调用时解析为 -nan(ind)。

如果它是一个非常小或非常大的数字我会理解,但为什么 C++ 将此计算解析为 -nan(ind)?有没有办法让它输出正确的值(-0.72477966367)?

我猜你想计算一个负数的五次方根,它可以写成 x ^ (1/n)。但是 C 和 C++ pow 不支持这个。请参阅 pow 文档:

If the base is finite negative and the exponent is finite but not an integer value, it causes a domain error.

你可以像这样让它输出正确的值:

template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

template <class T, class U> auto safe_pow(T val, U p) -> decltype(pow(val, p)) {
    return pow(abs(val), p) * sgn(val);
}

auto x = safe_pow(-0.2, 0.2);

Live Demo