System.Numerics.Complex special-value results now follow C23 Annex G

Complex Los operadores aritméticos y las funciones matemáticas ahora generan los resultados de valor especial (para ceros con signo, infinidades y NaNs) requeridos por el Anexo G C23 (IEC 60559-compatible con aritmética compleja). Dado que Complex ahora delega la mayor parte de su implementación en el nuevo Complex<double> tipo, el control de valores especiales compatible fluye a través de él.

Versión introducida

.NET 11 Preview 7

Comportamiento anterior

Anteriormente, para las entradas no finitas (y algunos desbordamientos), las Complex funciones aritméticas y elementales devolvieron (NaN, NaN) con frecuencia incluso cuando un resultado infinito o firmado dirigido era matemáticamente apropiado.

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)

Nuevo comportamiento

A partir de .NET 11, las mismas entradas devuelven los valores especiales del Anexo 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 división por un divisor cero se rige igualmente por el anexo G: el resultado es un infinito dirigido o NaN para 0/0. Por ejemplo, (1, 0) / (0, 0) produce un componente real infinito en lugar de un resultado naN completo.

El cambio abarca , operator /, Multiply, AbsReciprocalDivide, , Powy las funciones elementales (Sqrt, Exp, Log, Log10, y las funciones trigonométricasoperator *, hiperbólicas e inversas). En un caso, el Anexo G deja explícitamente sin especificar, es decir, el signo de un componente cociente con valores cero de operator /, también podría diferir.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Los números complejos están fuera del ámbito del propio IEEE 754, por lo que el anexo G C23 es la especificación pertinente del comportamiento de valor especial IEEE 754 en caso contrario implica para la aritmética compleja de operaciones escalares. La implementación anterior devolvió NaN muchas entradas en las que el Anexo G requiere un infinito dirigido o un resultado firmado, que es tanto no conforme como menos útil para el código numérico de bajada, ya que perdió la información de signo o dirección que lleva un valor intermedio infinito. El nuevo tipo genérico Complex<T> se hizo conforme y el tipo enviado Complex hereda esa conformidad por delegación.

Para obtener más información, consulte dotnet/runtime#131132.

La mayoría del código se beneficia de los resultados más precisos y no necesita ningún cambio. Si el código depende explícitamente de los resultados anteriores (NaN, NaN) para las entradas de valor especial, actualícelo para esperar los valores del anexo G. Este código puede ser pruebas que aseren NaN para Complex las operaciones en las densidades o la lógica que trate cualquier entrada no finita como la producción NaNde .

No hay ningún modificador de compatibilidad para restaurar el comportamiento anterior.

Las APIs afectadas