System.Numerics.Os resultados complexos de valores especiais seguem agora o Anexo C 23 G

Complex Os operadores aritméticos e as funções matemáticas produzem agora os resultados de valores especiais (para zeros com sinal, infinitos e NaNs) exigidos pelo Anexo C 23 G (aritmética complexa compatível com IEC 60559). Como Complex agora delega a maior parte da sua implementação ao novo Complex<double> tipo, o tratamento de valores especiais conforme flui para ele.

Versão introduzida

.NET 11 Pré-visualização 7

Comportamento anterior

Anteriormente, para entradas não finitas (e algumas que transbordam), Complex funções aritméticas e elementares frequentemente retornavam (NaN, NaN) mesmo quando um resultado de infinito dirigido ou de sinal era matematicamente apropriado.

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)

Novo comportamento

A partir do .NET 11, as mesmas entradas retornam os valores especiais do Anexo G do 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); // (+∞, +∞)

A divisão por um divisor de zero é igualmente regida pelo Anexo G: o resultado é um infinito dirigido, ou NaN para 0/0. Por exemplo, (1, 0) / (0, 0) produz um componente real infinito em vez de um resultado totalmente NaN.

A alteração abrange operator *, operator /, Multiply, DivideReciprocal, , Abs, Pow, , e as funções elementares (Sqrt, Exp, Log, Log10, e as funções trigonométricas, hiperbólicas e trigonométricas inversas). Um caso do Anexo G deixa explicitamente por especificar, ou seja, o signo de um componente quociente de valor zero de operator /, também pode diferir.

Tipo de mudança disruptiva

Esta mudança é uma mudança comportamental.

Motivo da mudança

Os números complexos estão fora do âmbito do próprio IEEE 754, pelo que o Anexo C C G é a especificação relevante do comportamento de valores especiais que o IEEE 754 implica para as operações escalares sobre as quais a aritmética complexa é construída. A implementação anterior retornava NaN para muitas entradas onde o Anexo G requer um infinito dirigido ou um resultado assinado, que é tanto não conforme como menos útil para código numérico a jusante, porque perdeu a informação de sinal ou direção que um valor intermédio infinito transporta. O novo tipo genérico Complex<T> foi tornado conforme, e o tipo enviado Complex herda essa conformidade por delegação.

Para mais informações, consulte dotnet/runtime#131132.

A maior parte do código beneficia de resultados mais precisos e não precisa de alterações. Se o seu código depender explicitamente dos resultados anteriores (NaN, NaN) para entradas de valores especiais, atualize-o para esperar os valores do Anexo G. Tal código pode ser testes que afirmam NaN para Complex operações sobre infinitos, ou lógica que trata qualquer entrada não finita como produzindo NaN.

Não existe um interruptor de compatibilidade para restaurar o comportamento anterior.

APIs afetadas