Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Complex Arithmetische Operatoren und mathematische Funktionen erzeugen nun die speziellen Werteergebnisse (für signierte Nullen, Infinitäten und NaNs), die von C23 Anhang G (IEC 60559-kompatible komplexe Arithmetik) erforderlich sind. Da Complex nun die meisten Implementierungen an den neuen Complex<double> Typ delegiert werden, fließt der konforme Sonderwertbehandlungsfluss an ihn weiter.
Eingeführt in Version
.NET 11 Vorschau 7
Bisheriges Verhalten
Für nicht endliche (und einige überlaufende) Eingaben Complex wurden (NaN, NaN) arithmetische und elementare Funktionen häufig zurückgegeben, auch wenn ein gerichtetes Unendlichkeits- oder signiertes Ergebnis mathematisch angemessen war.
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)
Neues Verhalten
Ab .NET 11 geben dieselben Eingaben die Sonderwerte des Anhangs C23 zurück.
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); // (+∞, +∞)
Die Division durch einen Null divisor wird ebenfalls durch Anhang G geregelt: Das Ergebnis ist eine gerichtete Unendlichkeit oder NaN für 0/0. Beispielsweise (1, 0) / (0, 0) ergibt eine unendliche reale Komponente anstelle eines vollständigen NaN-Ergebnisses.
Die Änderung erstreckt sich über operator *funktionen , , ReciprocalAbsMultiplyDivideoperator /Powund die elementaren Funktionen (Sqrt, Exp, , Log, Log10und die trigonometrischen, hyperbolischen und umgekehrten trigonometrischen Funktionen). Ein Fall von Anhang G lässt explizit nicht angegeben, d. h. das Zeichen einer nullwertigen Quotient-Komponente von operator /, könnte sich ebenfalls unterscheiden.
Art der einschneidenden Änderung
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Komplexe Zahlen liegen außerhalb des Umfangs von IEEE 754 selbst, daher ist C23 Anhang G die relevante Spezifikation des speziellen Wertverhaltens IEEE 754 andernfalls impliziert für die skalaren Operationen komplexe Arithmetik basiert. Die vorherige Implementierung wurde für viele Eingaben zurückgegeben NaN , bei denen Anhang G ein gerichtetes Unendlichkeits- oder ein signiertes Ergebnis erfordert, das sowohl nicht konform als auch weniger nützlich für nachgeschalteten numerischen Code ist, da es die Zeichen- oder Richtungsinformationen verloren hat, die ein unendlicher Zwischenwert trägt. Der neue generische Complex<T> Typ wurde konform gemacht, und der ausgelieferte Complex Typ erbt diese Konformität durch Delegierung.
Weitere Informationen finden Sie unter dotnet/runtime#131132.
Empfohlene Maßnahme
Die meisten Code profitieren von den genaueren Ergebnissen und benötigt keine Änderung. Wenn Ihr Code explizit von den vorherigen (NaN, NaN) Ergebnissen für Eingaben mit sonderwerten Werten abhängt, aktualisieren Sie ihn so, dass die Werte des Anhangs G erwartet werden. Ein solcher Code kann Tests sein, die für Vorgänge inFinitäten Complex oder Logik, die alle nicht endlichen Eingaben als produzierend NaNbehandeln, bestätigenNaN.
Es gibt keinen Kompatibilitätswechsel, um das vorherige Verhalten wiederherzustellen.
Betroffene APIs
- 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) und Complex.Pow(Complex, Double)
- Complex.Sqrt(Complex)
- Complex.Exp(Complex)
- Complex.Log(Complex) (alle Überladungen) und 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)