System.Numerics.Complex speciale-waarderesultaten volgen nu C23 Bijlage G

Complex Rekenkundige operatoren en wiskundige functies produceren nu de resultaten van speciale waarden (voor ondertekende nullen, infinities en NaN's) die vereist zijn voor C23 bijlage G (IEC 60559-compatibele complexe rekenkundige bewerkingen). Omdat Complex nu het grootste deel van de implementatie wordt gedelegeerd aan het nieuwe Complex<double> type, loopt de conforme afhandeling van speciale waarden door.

Geïntroduceerde versie

.NET 11 preview 7

Vorig gedrag

Voorheen werd voor niet-eindige (en sommige overlopende) invoer vaak Complex rekenkundige en elementaire functies geretourneerd (NaN, NaN) , zelfs wanneer een gericht oneindig of ondertekend resultaat wiskundig geschikt was.

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)

Nieuw gedrag

Vanaf .NET 11 retourneren dezelfde invoer de speciale waarden C23 bijlage 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); // (+∞, +∞)

Deling door een nuldeler valt eveneens onder bijlage G: het resultaat is een gerichte oneindigheid of NaN voor 0/0. Geeft bijvoorbeeld (1, 0) / (0, 0) een oneindig reëel onderdeel in plaats van een volledig NaN-resultaat.

De wijziging omvat , , , , , , Absen Powde elementaire functies (Sqrt, LogExp, , , Log10en de trigonometrische, hyperbolische en inverse-trigonometrische functies). ReciprocalDivideMultiplyoperator /operator * In bijlage G van één geval wordt expliciet niet aangegeven, dat wil gezegd dat het teken van een quotiëntcomponent met nulwaarden van operator /, kan ook verschillen.

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Complexe getallen vallen buiten het bereik van IEEE 754 zelf, dus C23 bijlage G is de relevante specificatie van het speciale-waardegedrag IEEE 754 anders impliceert voor de scalaire bewerkingen complexe rekenkundige bewerkingen. De vorige uitvoering die is geretourneerd NaN voor veel invoerwaarden waarbij bijlage G een gerichte oneindigheid of een ondertekend resultaat vereist, wat zowel niet-conform als minder nuttig is voor downstream numerieke code, omdat het de teken- of richtingsinformatie kwijtraakt die een oneindige tussenliggende waarde draagt. Het nieuwe algemene Complex<T> type is conform gemaakt en het verzonden Complex type neemt de conformiteit door delegatie over.

Zie dotnet/runtime#131132 voor meer informatie.

De meeste code profiteert van de nauwkeurigere resultaten en heeft geen verandering nodig. Als uw code expliciet afhankelijk is van de vorige (NaN, NaN) resultaten voor invoer met speciale waarden, moet u deze bijwerken om de bijlage G-waarden te verwachten. Een dergelijke code kan tests zijn die betrekking hebben NaN op bewerkingen op Complex infinities of logica die alle niet-eindige invoer behandelt als productie NaN.

Er is geen compatibiliteitsswitch om het vorige gedrag te herstellen.

Betreffende API's