pow(-0.857487, 1.5) returns NaN - 替代方案?
pow(-0.857487, 1.5) returns NaN - Alternatives?
在 C++ 中,当我尝试 pow(-0.857487, 1.5)
它时 returns nan。我发现这是由于溢出。
是否有替代 math.pow() 或任何其他方法来计算此值的方法?
手头的问题不是任何类型的溢出,而是 pow(-0.857487, 1.5) = -0.857487 ^ 3/2 = sqrt(-0.857487)^3 = -0.794038... i
(简化的数学演示)的结果不是实数。
一般来说,pow(a,b)
不存在于负数a
和非整数b
的实数中。然而,对于正数 a
,pow(a,b)
始终存在并且是实数,因此如果您只使用实数,您可能需要类似 pow(abs(a),b)
.
的东西
如果复杂的算术确实是你想要的,你可以使用std::complex
:
#include <iostream>
#include <complex>
int main () {
std::complex<double> d = -0.857487;
std::cout << std::pow(d, 1.5);
}
输出:(-1.45862e-16,-0.794038)
。看到了吧live.
非常好,我只想补充一点,让数学工作有一种卑鄙的把戏。
问题是你想对一个负数求1.5
次次方,即3/2
,负号为在提高到 3
rd 次方时保持不变,然后你得到一个不真实的负数的平方根。 "workaround" 是您可以将 1.5
写成 3/2
而不是 6/4
。这样指数 6
是偶数(不像 3
),它会使你的数字为正,然后根是实数。但是,这相当于在尝试将数字提高到 1.5
.
之前将数字设为正数
它可能有用,也可能没有用。正如我所说,这是一个肮脏的把戏,也是这个操作(负数的非整数幂)甚至没有定义的原因之一。
在 C++ 中,当我尝试 pow(-0.857487, 1.5)
它时 returns nan。我发现这是由于溢出。
是否有替代 math.pow() 或任何其他方法来计算此值的方法?
手头的问题不是任何类型的溢出,而是 pow(-0.857487, 1.5) = -0.857487 ^ 3/2 = sqrt(-0.857487)^3 = -0.794038... i
(简化的数学演示)的结果不是实数。
一般来说,pow(a,b)
不存在于负数a
和非整数b
的实数中。然而,对于正数 a
,pow(a,b)
始终存在并且是实数,因此如果您只使用实数,您可能需要类似 pow(abs(a),b)
.
如果复杂的算术确实是你想要的,你可以使用std::complex
:
#include <iostream>
#include <complex>
int main () {
std::complex<double> d = -0.857487;
std::cout << std::pow(d, 1.5);
}
输出:(-1.45862e-16,-0.794038)
。看到了吧live.
问题是你想对一个负数求1.5
次次方,即3/2
,负号为在提高到 3
rd 次方时保持不变,然后你得到一个不真实的负数的平方根。 "workaround" 是您可以将 1.5
写成 3/2
而不是 6/4
。这样指数 6
是偶数(不像 3
),它会使你的数字为正,然后根是实数。但是,这相当于在尝试将数字提高到 1.5
.
它可能有用,也可能没有用。正如我所说,这是一个肮脏的把戏,也是这个操作(负数的非整数幂)甚至没有定义的原因之一。