Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Complex Gli operatori aritmetici e le funzioni matematiche ora producono i risultati di valori speciali (per zeri firmati, infiniti e NaN) richiesti dall'allegato G C23 (IEC 60559- compatibile con aritmetica complessa). Poiché Complex ora delega la maggior parte della sua implementazione al nuovo Complex<double> tipo, la gestione di valori speciali conforme passa attraverso di essa.
Versione introdotta
.NET 11 Preview 7
Comportamento precedente
In precedenza, per gli Complex input non finiti (e alcuni overflowing), le funzioni aritmetiche e elementari spesso restituite (NaN, NaN) anche quando un risultato infinito diretto o con segno era matematicamente appropriato.
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)
Nuovo comportamento
A partire da .NET 11, gli stessi input restituiscono i valori speciali dell'allegato G C23.
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); // (+∞, +∞)
La divisione in base a un divisore zero è regolata in modo analogo dall'allegato G: il risultato è un infinito diretto o NaN per 0/0. Ad esempio, (1, 0) / (0, 0) restituisce un componente reale infinito anziché un risultato NaN completo.
La modifica si estende su operator *, MultiplyAbsDivideoperator /Reciprocal, Powe le funzioni elementari (Sqrt, Exp, LogLog10, e le funzioni trigonometriche, iperboliche e trigonometriche). Un caso allegato G lascia esplicitamente non specificato, ovvero il segno di un componente quoziente con valori zero da operator /, potrebbe anche differire.
Tipo di cambiamento che interrompe la compatibilità
Questa modifica è una modifica funzionale.
Motivo della modifica
I numeri complessi non rientrano nell'ambito di IEEE 754 stesso, pertanto C23 Annex G è la specifica pertinente del comportamento di valore speciale IEEE 754 in caso contrario implica che per le operazioni scalari complesse aritmetiche sia basato su . L'implementazione precedente restituita NaN per molti input in cui l'allegato G richiede un infinito diretto o un risultato firmato, che è sia non conforme che meno utile per il codice numerico downstream, perché ha perso il segno o le informazioni di direzione che un valore intermedio infinito trasporta. Il nuovo tipo generico Complex<T> è stato reso conforme e il tipo spedito Complex eredita tale conformità in base alla delega.
Per altre informazioni, vedere dotnet/runtime#131132.
Azione consigliata
La maggior parte del codice trae vantaggio dai risultati più accurati e non richiede alcuna modifica. Se il codice dipende in modo esplicito dai risultati precedenti (NaN, NaN) per gli input con valori speciali, aggiornarlo in modo da prevedere i valori allegato G. Tale codice potrebbe essere test che asserisce NaN per Complex le operazioni su infiniti o logica che considera qualsiasi input non finito come la produzione NaNdi .
Non esiste alcuna opzione di compatibilità per ripristinare il comportamento precedente.
Le API interessate
- 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) e Complex.Pow(Complex, Double)
- Complex.Sqrt(Complex)
- Complex.Exp(Complex)
- Complex.Log(Complex) (tutti gli overload) e 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)