在C ++中,当我尝试pow(-0.857487, 1.5)
时,它返回nan。我发现这是由于溢出。
有没有替代math.pow()或任何其他方法来计算这个值?
答案 0 :(得分:12)
手头的问题不是任何类型的溢出,而是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)
:
Microsoft.Practices.Unity
输出:<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
。见live。
答案 1 :(得分:0)
Baum mit Augen's answer非常好,我想补充一点,有一些肮脏的技巧让数学运作。
问题是你想要将负数提升到1.5
th 次幂,即3/2
,并且在提升到3
时会保留负号。 1.5
rd 权力,然后你有一个负数的平方根,这是不真实的。 “解决方法”是您可以将3/2
写为6/4
,而不是6
。这样,指数3
是偶数(与1.5
不同),它将使您的数字为正,然后根是真实的。但是,这相当于在您尝试将其提升为# Perform lex sort and get the sorted array version of the input
sorted_idx = np.lexsort(A.T)
sorted_Ar = A[sorted_idx,:]
# Mask of start of each unique row in sorted array
mask = np.append(True,np.any(np.diff(sorted_Ar,axis=0),1))
# Get counts of each unique row
unq_count = np.bincount(mask.cumsum()-1)
# Compare counts to 1 and select the corresponding unique row with the mask
out = sorted_Ar[mask][np.nonzero(unq_count==1)[0]]
之前使您的数字为正数。
它可能,也可能不会有用。正如我所说,这是一个肮脏的技巧,并且这个操作(负数的非整数幂)甚至没有被定义的原因之一。