我在这个C#代码中使用Math.Pow(a,b)函数有多难?

a.s*_*sam 1 c# math pow

我发现以下代码没有任何问题,MSVC#编译器将NAN存储在"c"中:

double c = Math.Pow(-8d, 1d / 3d);
Run Code Online (Sandbox Code Playgroud)

虽然我认为这行应该为"c"计算-2,但编译器将NAN存储在"c"中?我错了什么?

Sve*_*ach 7

浮点数的幂函数仅针对正基数或积分指数定义.尝试

double c = - Math.Pow(8d, 1d / 3d);
Run Code Online (Sandbox Code Playgroud)

实际上,1/3不能完全表示为浮点数,但需要舍入.圆形指数的确切实际结果在理论上甚至不存在.


Seb*_*olm 5

通常,人们不会说(-8)^(1/3)= -2.

实际上,(-2)^ 3 = -8是正确的,但负数的幂是一个复杂的问题.

您可以在维基百科上阅读有关该问题的更多信息:

对数方法和有理指数方法都不能用于将^ r定义为负实数a和任意实数r的实数.实际上,对于每个实数r,er是正的,因此ln(a)不被定义为a≤0的实数.(另一方面,负数a的任意复数幂可以通过选择复数对数来定义.一个.)

简而言之,在数学上很难正确定义a r应该是什么,当a是负数时,以免开始使用复数,因此通常应该避免尝试这样做.