I risultati speciali di System.Numerics.Complex seguono ora l'allegato G C23

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.

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