-1

わかりましたので、この質問から、整数でない指数を持つ負の数を使用して pow() を実行すると、結果が NaN になることがわかりました。

私の質問は次のとおりです。答えを得るために使用できる代替方法はありますか? 次のようなことができるようになりたいだけです。

MyPowFunction(-3125, 0.2);

結果を (正しく) -5 にします。

何かご意見は?


補足として、これは(何とか)行うことができます。Google はそれを理解しました: https://www.google.com/search?q=%28-3125%29%5E0.2&oq=%28-3125%29%5E0.2


もう 1 つ注意してください: 私は二重の結果には興味がありません。結果が複雑であってもまったく問題ありません。

4

3 に答える 3

4

a がで b が (複素数) 任意の場合、a^b を exp(b log a) として定義できます。これは、b が有理数の場合に直接拡張されます。

ここで、a が複素数 (ただしゼロではない) の場合、a^b を類推(適切な用語は「分析継続」) によって exp(b Log a) として定義できます。ここで、Log はexp の可能な逆数の 1 つです。

たとえば、考えられる対数関数の 1 つ (2 i pi の倍数だけ異なる無数の関数があります) は次のとおりです。

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

任意の k について、これが exp の逆数を与えることを確認してください (定義域に関する詳細はスキップします。z が 1 つだけであると仮定して、exp(Log z) = z となるような Log 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 のように)、a^0.2 に対して 5 つの異なる候補が得られます (そのうちの 1 つは実数です)。

于 2012-04-22T16:30:59.290 に答える
2

問題は、次の理由により、「数学的に正しい答え」で-5ないということです。

  • 0.2は正確には1/5ではありません。あなたは実際に-3125から0.200000000000000011102230246251565404236316680908203125乗を求めています。これには非常に大きなソリューションファミリーがあります。
  • 通常の数学的慣例は、exp(y * log(x))の評価から得られるx ^ yの解を選択することです。ここで、log(x)は、負の実軸上で分岐をカットするために使用されます。-3125はブランチカット上にあるため、どちら側にあるかを決定する必要があります。慣例はそれを前向きにすることです。
  • 0.2が浮動小数点で表現可能であると仮定しても、慣例に従って式を評価すると、予想どおり-5ではなく、4.045084971874738+2.9389262614623664iの結果が得られます。
于 2012-04-22T16:04:18.317 に答える
1

負の数を非整数の累乗に上げると、複雑な結果が生成されます。.NET4で使用可能な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 に答える