pow(-0.857487,1.5)返回NaN - 替代品?

时间:2015-11-18 17:51:41

标签: c++ nan pow

在C ++中,当我尝试pow(-0.857487, 1.5)时,它返回nan。我发现这是由于溢出。

有没有替代math.pow()或任何其他方法来计算这个值?

2 个答案:

答案 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]] 之前使您的数字为正数。

它可能,也可能不会有用。正如我所说,这是一个肮脏的技巧,并且这个操作(负数的非整数幂)甚至没有被定义的原因之一。