1

さて、私は 2 つの大きな複素数値を持っています。上と下:

トップ = 4.0107e+030

ボット = 5.46725E26 -2.806428e26i

これら 2 つの数値を Math.Net の Complex32 で除算すると、実数と虚数の両方に NaN が返されます。精度と関係があると思います。

Matlab を使用すると、次のようになります。

上/下 = 5.8060e+003 +2.9803e+003i

System.Numerics を使用すると、少なくとも正しい大きさの順序で、matlabs に非常に近いものが得られます。

トップ/ボット = +5575.19343780947 +2676.09270239214i System.Numerics.Complex

どちらが正しいのだろうか?そして、Math.Net が間違った答えを返すのはなぜですか? とにかくこれを修正するには?私は多くの大きな複素数を扱っています。

さらに、補完エラー関数や複雑なパラメーターのエラー関数などの特別な関数をサポートする .net 用の優れた複雑なライブラリを知っている人がいれば、それは素晴らしいことです。Math.Netがcomplex32のサーフをサポートしていないことがわかったので

4

1 に答える 1

0

精度を重視する場合は、単精度/32 ビット型ではなく、倍精度/64 ビット型を使用する必要があります。互換性のために System.Numerics で提供される Complex 型を使用する必要があるため、通常のパッケージでは Complex32 のみを提供し、Complex (64) 型は提供しないことに注意してください。ポータブル ビルドでは、同等の Complex (64) 型のみを提供します。 System.Numerics はそこで利用できません。

しかし、この特定のケースでは、これは精度 (または精度) の問題ではなく、範囲の問題です。32 ビットの浮動小数点数は ~3.4e+38 より大きくできないことに注意してください。通常の直接形式で複雑な除算を計算するには、分母の実数成分と虚数成分の両方の二乗を計算する必要があります。この場合、範囲外になり、「無限大」になり、最終結果で NaN になります。

現在、分母が約 1e+19 よりも大きい場合に平方を計算することを回避する形式で除算を実装することは可能かもしれませんが、Math.NET Numerics ではまだそれを行っていません (要求がなかったため)。今まで)。複合型が極性形式を実装する場合、これも問題にはなりませんが、これは非常にまれです。

于 2013-08-18T20:44:10.403 に答える