Nouvelles Du Monde

Nouveau dans .NET 7 [9]: Mathématiques génériques

Nouveau dans .NET 7 [9]: Mathématiques génériques

Les mathématiques génériques dans .NET 7.0 incluent certaines interfaces dans l’espace de noms de la classe de base System.Numericsqui permettent d’implémenter des opérations mathématiques de manière à ce qu’elles fonctionnent pour tout type de nombre – nombres entiers et fractionnaires de n’importe quelle longueur en bits.

Mourir dans .NET 6.0 marqué comme expérimental opérations mathématiques génériques comme INumber, INumberBase, IComparisonOperators, IAdditionOperators, IMultiplyOperators et ISubtractionOperators ont atteint la maturité de production avec .NET 7.0.

La liste suivante montre un exemple significatif d’un calcul mathématique générique dans la méthode Calc() et une extraction générique d’un nombre à partir d’une chaîne dans ParseNumber(). Entre autres choses, le type de nombre nouvellement introduit dans .NET 7.0 est inclus System.Int128 (entier, 16 octets) sont utilisés.

using System.Globalization;
using System.Numerics;
 
namespace CS11;
 
public class CS11_GenericMath
{
 T Calc(T x, T y)
  where T : INumber // Neues Interface mit 
                       // static abstract Members!
 {
  Console.WriteLine(
    $"Calc {x.GetType().ToString()}/{y.GetType().ToString()}");
  if (x == T.Zero || y <= T.Zero) return T.One;
  return (x + y) * T.CreateChecked(42.24);
 }
 
 T ParseNumber(string s)
    where T : IParsable
 {
  return T.Parse(s, CultureInfo.InvariantCulture);
 }
 
 public void Run()
 {
  CUI.H2("Calc mit 1 und 2");
  Console.WriteLine($"Ergebnis mit System.Byte: 
    {Calc((byte)1, (byte)2)}"); // 126
  Console.WriteLine($"Ergebnis mit System.Int32: 
    {Calc(1, 2)}"); // 126
  Console.WriteLine($"Ergebnis mit System.Int128: 
    {Calc( (Int128)1, (Int128)2)}"); // 126
  Console.WriteLine($"Ergebnis mit System.Single: 
    {Calc((Single)1.0, (Single)2.0)}"); // 126,72
  Console.WriteLine($"Ergebnis mit System.Double: 
    {Calc(1.0d, 2.0d)}"); // 126,72
  Console.WriteLine($"Ergebnis mit System.Decimal: 
    {Calc(1.0m, 2.0m)}"); // 126,720
  Console.WriteLine($"Ergebnis mit System.Half: 
    {Calc((Half)1.0m, (Half)2.0m)}"); // 126,75
 
  CUI.H2("ParseNumber 1.00 und 2.00");
  var x = ParseNumber("1.00");
  var y = ParseNumber("2.00");
 
  Console.WriteLine($"Ergebnis mit System.Single: 
    {Calc(x, y)}"); // 3,6000001
  Console.WriteLine($"Ergebnis mit System.Int32: 
    {Calc(0, 1)}"); // 1
 }
}

La contribution du langage de programmation C# ici est la possibilité de définir des membres abstraits statiques dans les interfaces, ce qui est possible expérimentalement depuis C# 10.0 et fait officiellement partie de la syntaxe du langage depuis C# 11.0. Microsoft utilise ce modificateur dans les classes de base comme INumberBase.

public interface INumberBase
        : IAdditionOperators,
          IAdditiveIdentity,
          IDecrementOperators,
          IDivisionOperators,
          IEquatable,
          IEqualityOperators,
          IIncrementOperators,
          IMultiplicativeIdentity,
          IMultiplyOperators,
          ISpanFormattable,
          ISpanParsable,
          ISubtractionOperators,
          IUnaryPlusOperators,
          IUnaryNegationOperators
        where TSelf : INumberBase?
    {
/// Gets the value 1 for the type.
static abstract TSelf One { get; }

/// Gets the value 0 for the type.
static abstract TSelf Zero { get; }
…

/// Tries to parses a string into a value.
static abstract bool TryParse([NotNullWhen(true)] string? s,
                               NumberStyles style, 
                               IFormatProvider? provider,
                               out TSelf result);
}


(rme)

Lire aussi  Un simulateur quantique et une vision artificielle, parmi les projets sélectionnés par le Programme Fondamentaux de la Fondation BBVA | Science

Vers la page d’accueil

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

ADVERTISEMENT