C#Math.Pow()坏了

cow*_*tor 5 .net math floating-point exponent pow

不,这(我的理解)不涉及整数除法或浮点舍入问题.

我的确切代码是:

    static void Main(string[] args)
    {
        double power = (double)1.0 / (double)7.0;
        double expBase = -128.0;
        System.Console.WriteLine("sanity check: expected: -128 ^ 0.142857142857143 = -2.    actual: " + expBase + " ^ " + power + " = " + Math.Pow(expBase, power));
        System.Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

sanity check: expected: -128 ^ 0.142857142857143 = -2. actual: -128 ^ 0.14285 7142857143 = NaN

此代码的目标框架是(根据解决方案属性).NET Framework 4.0 Client Profile.

奇怪的是,我在网上的任何地方都没有发现这一点.我在这里吃疯了吗??

Joa*_*son 17

似乎完全符合规定; 从所述Math.Pow()备注部分Pow(x,y);

参数
x <0但不是NegativeInfinity; y不是整数,NegativeInfinity或PositiveInfinity.

结果
NaN


Ste*_*non 12

约阿希姆的回答解释说,战俘的行为符合其规范.

为什么指定pow()?因为1.0/7.0不等于1/7.你要求的0.14285714285714285权力-128.0,并没有该属性的实数,所以结果是正确的NaN.对于所有奇数n != 1,1.0/(double)n并不完全可表示,因此您无法通过使用来计算x的第n个根pow(x, 1.0/(double)n).因此pow(x, y)指定为负x和非整数y返回NaN - 对于任何这些情况都没有适当的实际结果.

  • 但想想它会给Stack Overflow上的问题增加多少.由于正确的舍入算法,我们可以解释1.8019 ...是如何正确舍入`pow(-128,1/7.)`而不是解释.1 + .2如何给出.30 ... 01. (2认同)