-1

好的,所以我从这个问题中收集到,当您使用带有非整数指数的负数来获取 pow() 时,结果是 NaN。

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

MyPowFunction(-3125, 0.2);

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

有什么想法吗?


作为附录,可以(以某种方式)这样做。谷歌已经弄清楚了:https ://www.google.com/search?q=%28-3125%29%5E0.2&oq=%28-3125%29%5E0.2


还有一点需要注意:我对双重结果不感兴趣——结果很复杂我完全没问题。

4

3 回答 3

4

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

现在,如果 a 是复数(但非零),则可以通过类比(专有名词是“解析延拓”)将 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 个不同的 a^0.2 候选(其中一个是真实的)。

于 2012-04-22T16:30:59.290 回答
2

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

  • 0.2 不完全是 1/5。您实际上要求 -3125 到 0.2000000000000000011102230246251565404236316680908203125 次方,它有一个非常大的解决方案系列。
  • 通常的数学惯例是选择从评估 exp(y*log(x)) 中得到的 x^y 的解,其中 log(x) 被认为是在负实轴上有一个分支切割。-3125 位于分支切口上,因此您必须决定它在哪一侧。惯例是把它放在积极的一面。
  • 即使假设 0.2 可以用浮点表示,根据约定评估您的表达式也会得到 4.045084971874738 + 2.9389262614623664i 的结果,而不是您似乎期望的 -5。
于 2012-04-22T16:04:18.317 回答
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不足以保证在任何合理的预测中使其为负值。

于 2012-04-22T16:16:29.917 回答