Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Complex Les opérateurs arithmétiques et les fonctions mathématiques produisent désormais les résultats spéciaux (pour les zéros signés, infinis et NaN) requis par l’annexe G C23 (IEC 60559-compatible arithmétique complexe). Étant donné que Complex maintenant délègue la plupart de son implémentation au nouveau Complex<double> type, la gestion de valeur spéciale conforme transite par celle-ci.
Version introduite
.NET 11 Preview 7
Comportement antérieur
Auparavant, pour les entrées non limitées (et certains dépassements de capacité), les Complex fonctions arithmétiques et élémentaires retournaient (NaN, NaN) fréquemment même lorsqu’un résultat infini ou signé dirigé était mathématiquement approprié.
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)
Nouveau comportement
À compter de .NET 11, les mêmes entrées retournent les valeurs spéciales de l’annexe C23 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); // (+∞, +∞)
La division par un diviseur zéro est également régie par l’annexe G : le résultat est une infinité dirigée, ou NaN pour 0/0. Par exemple, (1, 0) / (0, 0) génère un composant réel infini plutôt qu’un résultat NaN complet.
Les étendues de modification, MultiplyReciprocalPowoperator /DivideAbs, et les fonctions élémentaires operator *(Sqrt, Exp, Log, Log10, et les fonctions trigonométriques, hyperboliques et inverse-trigonométriques). L’annexe G laisse explicitement non spécifié, c’est-à-dire le signe d’un composant quotient à valeur nulle de operator /, peut également différer.
Type de changement cassant
Ce changement est un changement de comportement.
Raison du changement
Les nombres complexes sont en dehors de l’étendue de l’IEEE 754 lui-même. C23 Annexe G est donc la spécification pertinente du comportement à valeur spéciale IEEE 754, sinon implique pour l’arithmétique complexe des opérations scalaires est basée. L’implémentation précédente retournée NaN pour de nombreuses entrées où l’annexe G nécessite une infinité dirigée ou un résultat signé, qui est à la fois non conforme et moins utile pour le code numérique en aval, car il a perdu les informations de signe ou de direction qu’une valeur intermédiaire infinie porte. Le nouveau type générique Complex<T> a été rendu conforme, et le type expédié Complex hérite de cette conformité par délégation.
Pour plus d’informations, consultez dotnet/runtime#131132.
Action recommandée
La plupart du code tire parti des résultats plus précis et n’a besoin d’aucune modification. Si votre code dépend explicitement des résultats précédents (NaN, NaN) pour les entrées à valeur spéciale, mettez-le à jour pour attendre les valeurs annexe G. Ce code peut être des tests qui affirment NaN des Complex opérations sur infinis ou une logique qui traite toute entrée non finie comme produisant NaN.
Il n’existe aucun commutateur de compatibilité pour restaurer le comportement précédent.
API affectées
- 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) et Complex.Pow(Complex, Double)
- Complex.Sqrt(Complex)
- Complex.Exp(Complex)
- Complex.Log(Complex) (toutes les surcharges) et Complex.Log10(Complex)
- Complex.Sin(Complex), , Complex.Cos(Complex), Complex.Sinh(Complex)Complex.Tan(Complex), , Complex.Cosh(Complex)Complex.Tanh(Complex)
- Complex.Asin(Complex), , Complex.Acos(Complex)Complex.Atan(Complex)