2

我找不到以下代码有任何问题,因此 MSVC# 编译器将 NAN 存储在“c”中:

double c = Math.Pow(-8d, 1d / 3d);

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

4

3 回答 3

7

浮点数的幂函数仅针对正基数或整数指数定义。尝试

double c = - Math.Pow(8d, 1d / 3d);

实际上,1/3 不能完全表示为浮点数,而是需要四舍五入。理论上甚至不存在四舍五入指数的精确真实结果。

于 2011-01-18T11:08:37.007 回答
6

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

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

您可以在Wikipedia上阅读有关该问题的更多信息:

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

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

于 2011-01-18T11:11:39.480 回答
3

答案是一个复数:1.0+1.732050807568877i。.NET 的 Math 类不支持复数。

于 2011-01-18T11:10:11.870 回答