计算负数的pow()到非整数指数

时间:2012-04-22 15:48:15

标签: .net math

好的,所以我从this question收集到当你使用带有非整数指数的负数来获取pow()时,结果是NaN。

所以我的问题是:我可以使用一些替代方法来获得答案吗?我只是希望能够做到这样的事情:

MyPowFunction(-3125, 0.2);

并且结果为(正确)-5。

有什么想法吗?


作为附录,可能这样做(不知何故)。谷歌已经弄明白了:https://www.google.com/search?q=%28-3125%29%5E0.2&oq=%28-3125%29%5E0.2


还有一点需要注意:我对双重结果不感兴趣 - 我的结果非常复杂。

3 个答案:

答案 0 :(得分:4)

如果a 且b是(复数)任意,则可以将^ b定义为exp(b log a)。这直接扩展了b是有理数的情况。

现在,如果a是复杂的(但非零),可以通过类比(正确的术语是“解析延续”)将^ b定义为exp(b Log a),其中Log是<强>一个可能的逆的exp。

例如,一个可能的Log函数(有很多,不同的是2 i pi的倍数)

Log z = log |z| + i(arg z + 2k pi), k as you wish

检查对于任何k,这给出了与exp的反转(我跳过关于定义域的细节:只是假装只有一个z,我们想要找到Log z这样exp(Log z)= z )。

您选择k的方式将因此影响答案。如果b是不合理的,那么

"a^b" = exp(b Log a) = exp(ib arg a) * exp(2i k pi * b) * |a|

由于k可以是任意的,exp(2i k pi * b)可以任意接近你想要的单位圆数(单位圆=单位模数的数字),有无穷多的“a ^”值b“可能。

如果b是理性的(例如0.2 = 1/5),那么你将获得5个不同的候选者,其中一个是^ 0.2(其中一个是真实的)。

答案 1 :(得分:2)

问题在于-5 “数学上正确的答案”,原因如下:

  • 0.2不完全是1/5。你实际上要求-3125到0.200000000000000011102230246251565404236316680908203125th电源,它有一个非常大的解决方案系列。
  • 通常的数学约定是选择从评估exp(y * log(x))得到的x ^ y的解,其中log(x)用于在负实轴上进行分支切割。 -3125位于分支切口上,因此您必须决定它在哪一侧。公约是把它放在积极的一面。
  • 即使假设0.2在浮点数中可以表示,根据惯例评估你的表达式会得到4.045084971874738 + 2.9389262614623664i的结果,而不是你想象的-5。

答案 2 :(得分:1)

将负数增加到非整数幂会产生复杂的结果。您可以使用.NET 4中提供的System.Numerics.Complex类来计算它。例如:

using System;
using System.Numerics;   // Add reference to System.Numerics!!

class Program {
    static void Main(string[] args) {
        var c = new Complex(-3125, 0);
        var p = Complex.Pow(c, 0.2);
        Console.WriteLine(p);
        var result = p.Magnitude;
        Console.WriteLine(result);
        Console.ReadLine();
    }
}

输出:

(4.04508497187474, 2.93892626146237)
5

使结果为负值将需要一些富有想象力的虚构操作。 result.Phase的值不足以保证在任何合理的预测中都是负数。