Complex 算術演算子と算術関数では、C23 Annex G (IEC 60559 と互換性のある複合算術) で必要な特殊値の結果 (符号付きゼロ、無限大、および NaN の場合) が生成されるようになりました。
Complex実装の大部分が新しいComplex<double>型に委任されるようになったため、準拠した特別な値の処理がそれに流れます。
導入されたバージョン
.NET 11 Preview 7
以前の動作
以前は、有限 (およびいくつかのオーバーフロー) 入力の場合、 Complex 算術関数と基本関数は、向けられた無限大または符号付きの結果が数学的に適切であった場合でも、 (NaN, NaN) を頻繁に返していました。
using System.Numerics;
Complex.Atan(new Complex(double.PositiveInfinity, 1.0)); // (NaN, NaN)
Complex.Acos(new Complex(double.NegativeInfinity, double.NaN)); // (NaN, NaN)
Complex.Cosh(new Complex(double.PositiveInfinity, double.PositiveInfinity)); // (NaN, NaN)
// An infinite operand could collapse the product to NaN:
new Complex(double.PositiveInfinity, double.PositiveInfinity) * new Complex(1.0, 0.0); // (NaN, NaN)
新しい動作
.NET 11 以降では、同じ入力が C23 Annex G の特別な値を返します。
using System.Numerics;
Complex.Atan(new Complex(double.PositiveInfinity, 1.0)); // (π/2, 0)
Complex.Acos(new Complex(double.NegativeInfinity, double.NaN)); // (NaN, +∞)
Complex.Cosh(new Complex(double.PositiveInfinity, double.PositiveInfinity)); // (+∞, NaN)
// An infinite operand now yields a directed infinity (Annex G.5.1 recovery):
new Complex(double.PositiveInfinity, double.PositiveInfinity) * new Complex(1.0, 0.0); // (+∞, +∞)
ゼロ除数による除算も同様に、Annex G によって管理されます。結果は、向けられた無限大( 0/0の NaN) になります。 たとえば、 (1, 0) / (0, 0) では、完全な NaN 結果ではなく、無限の実数コンポーネントが生成されます。
変更は、 operator *、 operator /、 Multiply、 Divide、 Reciprocal、 Abs、 Pow、基本関数 (Sqrt、 Exp、 Log、 Log10、三角関数、双曲線関数、逆三角関数) に及びます。 Annex G が明示的に指定されていない場合、つまり、 operator /からのゼロ値商コンポーネントの符号も異なる場合があります。
破壊的変更の種類
この変更は 動作の変更です。
変更理由
複素数は IEEE 754 自体の範囲外であるため、C23 Annex G は特別な値の動作の関連する仕様です。それ以外の場合は、スカラー演算の複雑な算術演算が構築されていることを意味します。 前の実装では、Annex G が無限大または符号付き結果を必要とする多くの入力に対して NaN が返されました。これは、無限の中間値が保持する符号または方向情報を失うため、ダウンストリームの数値コードでは不適合であり、あまり役に立ちません。 新しいジェネリック Complex<T> 型が準拠し、出荷された Complex 型は委任によってその準拠を継承します。
詳細については、「 dotnet/runtime#131132」を参照してください。
推奨されるアクション
ほとんどのコードは、より正確な結果から恩恵を受け、変更を必要としません。 コードが特別な値入力の前の (NaN, NaN) の結果に明示的に依存している場合は、Annex G 値を想定するように更新します。 このようなコードは、無限大に対するComplex操作のNaNをアサートするテストや、有限でない入力をNaNを生成するロジックなどです。
以前の動作を復元するための互換性スイッチはありません。
影響を受ける API
- Complex.Multiply(Complex, Complex)
- Complex.Division(Complex, Complex)
- Complex.Multiply(Complex, Complex)
- Complex.Divide(Complex, Complex)
- Complex.Reciprocal(Complex)
- Complex.Abs(Complex)
- Complex.Pow(Complex, Complex) と Complex.Pow(Complex, Double)
- Complex.Sqrt(Complex)
- Complex.Exp(Complex)
- Complex.Log(Complex) (すべてのオーバーロード) と Complex.Log10(Complex)
- Complex.Sin(Complex)、 Complex.Cos(Complex)、 Complex.Tan(Complex)、 Complex.Sinh(Complex)、 Complex.Cosh(Complex)、 Complex.Tanh(Complex)
- Complex.Asin(Complex)、Complex.Acos(Complex)、Complex.Atan(Complex)
.NET