Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Complex Operadores aritméticos e funções matemáticas agora produzem os resultados de valor especial (para zeros assinados, infinitos e NaNs) exigidos pelo Anexo G do C23 (aritmética complexa compatível com IEC 60559). Como Complex agora delega a maior parte de sua implementação para o novo Complex<double> tipo, o tratamento de valor especial compatível flui até ele.
Versão introduzida
.NET 11 Versão Prévia 7
Comportamento anterior
Anteriormente, para entradas não finitas (e algumas excedentes), Complex as funções aritméticas e elementares frequentemente retornavam (NaN, NaN) mesmo quando um resultado infinity ou assinado direcionado 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 zero é regida da mesma forma pelo Anexo G: o resultado é um infinito direcionado 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, Divide, Reciprocal, Abs, Powe as funções elementares (Sqrt, Exp, , Log, Log10e as funções trigonométricas, hiperbólicas e inversas-trigonométricas). Um caso em que o Anexo G deixa explicitamente não especificado, ou seja, o sinal de um componente operator /quociente com valor zero também pode ser diferente.
Tipo de mudança disruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Números complexos estão fora do escopo do próprio IEEE 754, portanto, o Anexo G do C23 é a especificação relevante do comportamento de valor especial IEEE 754, caso contrário, implica para que a aritmética complexa de operações escalares seja criada. A implementação anterior retornada NaN para muitas entradas em que o Anexo G requer um infinito direcionado ou um resultado assinado, que é não compatível e menos útil para código numérico downstream, porque perdeu as informações de sinal ou direção que um valor intermediário infinito carrega. O novo tipo genérico Complex<T> foi feito em conformidade e o tipo enviado Complex herda essa conformidade por delegação.
Para obter mais informações, consulte dotnet/runtime#131132.
Ação recomendada
A maioria dos benefícios de código dos resultados mais precisos e não precisa de nenhuma alteração. Se o código depender explicitamente dos resultados anteriores (NaN, NaN) para entradas de valor especial, atualize-o para esperar os valores do Anexo G. Esse código pode ser testes que declaram NaN operações Complex em infinitos ou lógica que trata qualquer entrada não finita como produção NaN.
Não há nenhuma opção de compatibilidade para restaurar o comportamento anterior.
APIs afetadas
- 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) (todas as sobrecargas) 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)