Aller au contenu

Exécuter des calculs

math : fonctions mathématiques

Le module math fournit des fonctions pour les nombres réels et des constantes comme pi et e. Pour les nombres complexes, le module correspondant est cmath.

Élément Rôle
sqrt(x) Racine carrée.
floor(x) / ceil(x) Entier inférieur / supérieur.
trunc(x) Suppression de la partie fractionnaire vers zéro.
factorial(n) Factorielle d'un entier positif ou nul.
gcd(a, b) / lcm(a, b) PGCD / PPCM.
sin(x), cos(x), tan(x) Trigonométrie, avec des angles en radians.
radians(x) / degrees(x) Conversion d'angle.
log(x) / log10(x) Logarithme naturel / décimal.
isclose(a, b) Comparaison approchée de nombres.
fsum(values) Somme de flottants avec une précision améliorée.
import math

radius = 3
area = math.pi * radius ** 2

print(f"Surface : {area:.2f}")       # Surface : 28.27
print(math.floor(-2.3))             # -3
print(math.trunc(-2.3))             # -2
print(math.isclose(0.1 + 0.2, 0.3)) # True

Parallèle C# et .NET

Python C# / .NET
sqrt, floor, ceil, trunc Math.Sqrt, Math.Floor, Math.Ceiling, Math.Truncate
sin, cos, tan Math.Sin, Math.Cos, Math.Tan
log, log10 Math.Log, Math.Log10
radians(degrees) degrees * Math.PI / 180
double radius = 3;
double area = Math.PI * radius * radius;
Console.WriteLine($"Surface : {area:F2}");
Console.WriteLine(Math.Floor(-2.3));    // -3
Console.WriteLine(Math.Truncate(-2.3)); // -2
Console.WriteLine(Math.Abs((0.1 + 0.2) - 0.3) <= 1e-12); // True

Math couvre de nombreuses opérations de math. Le test de tolérance absolue montré est adapté à cet exemple, sans reproduire les tolérances relatives et absolues de math.isclose(). Pour les grands entiers, BigInteger fournit notamment GreatestCommonDivisor(). Une factorielle ou un PPCM exigent une composition ; Sum() ne garantit pas la même précision que math.fsum().

statistics : statistiques descriptives

Ce module convient aux calculs statistiques courants sur des collections de nombres.

Fonction Rôle
mean(values) Moyenne arithmétique.
fmean(values) Moyenne renvoyée comme flottant.
median(values) Médiane.
mode(values) / multimode(values) Valeur la plus fréquente / toutes les valeurs les plus fréquentes.
stdev(values) / variance(values) Écart-type / variance d'un échantillon.
pstdev(values) / pvariance(values) Écart-type / variance d'une population entière.
import statistics

numbers = [12, 7, 25, 8, 14, 3, 19]
print(f"Moyenne : {statistics.mean(numbers):.2f}")  # Moyenne : 12.57
print(statistics.median(numbers))                 # 12

Les calculs peuvent lever StatisticsError si les données sont insuffisantes. Par exemple, stdev() exige au moins deux valeurs.

Parallèle C# et .NET

double[] numbers = { 12, 7, 25, 8, 14, 3, 19 };
Console.WriteLine(numbers.Average().ToString("F2", CultureInfo.InvariantCulture));
double[] ordered = numbers.OrderBy(n => n).ToArray();
int middle = ordered.Length / 2;
double median = ordered.Length % 2 == 0
    ? (ordered[middle - 1] + ordered[middle]) / 2.0
    : ordered[middle];
Console.WriteLine(median); // 12

LINQ fournit Average(), mais pas un module statistique complet équivalent à statistics. La médiane est calculée ici pour un tableau non vide. Le mode se rapproche d’un GroupBy() suivi d’un décompte. Pour la variance, il faut choisir explicitement population ou échantillon et une formule numériquement adaptée ; ne remplaçons pas automatiquement ces fonctions par une moyenne de carrés.

decimal : calculs décimaux

Le type Decimal permet de travailler avec des nombres décimaux et un contexte de précision configurable. Il convient notamment aux montants et aux règles d'arrondi explicites.

Élément Rôle
Decimal(text) Construire une valeur décimale.
value.quantize(model, rounding=...) Appliquer une précision et un mode d'arrondi.
localcontext() Modifier temporairement le contexte des calculs.
ROUND_HALF_UP Départager les égalités en s'éloignant de zéro.
from decimal import Decimal, ROUND_HALF_UP

price = Decimal("19.99")
tax_rate = Decimal("0.20")
total = (price * (1 + tax_rate)).quantize(
    Decimal("0.01"), rounding=ROUND_HALF_UP
)
print(total)  # 23.99

Construisons les valeurs à partir de chaînes : Decimal(0.1) conserve l'approximation du flottant fourni. Les règles d'arrondi doivent correspondre au besoin métier.

Parallèle C# et .NET

decimal price = 19.99m;
decimal taxRate = 0.20m;
decimal total = Math.Round(price * (1 + taxRate), 2, MidpointRounding.AwayFromZero);
Console.WriteLine(total.ToString(CultureInfo.InvariantCulture)); // 23.99

Le suffixe m crée une constante decimal C#. AwayFromZero correspond ici au départage des égalités de ROUND_HALF_UP. decimal .NET a une capacité et une précision fixes ; Decimal Python s’appuie sur un contexte configurable. Il n’existe pas de correspondance générale entre ce contexte et un contexte global decimal en C#.

random : tirages pseudo-aléatoires

random convient aux simulations, aux jeux et aux jeux de données de test.

Fonction Rôle
random() Flottant dans [0, 1[.
randint(a, b) Entier entre les deux bornes incluses.
randrange(start, stop, step) Tirage dans une progression ; fin exclue.
uniform(a, b) Flottant entre deux bornes.
choice(values) Choisir un élément.
sample(values, k) Tirer sans remise.
choices(values, k=...) Tirer avec remise.
shuffle(values) Mélanger une liste sur place.
import random

rng = random.Random(42)
print(rng.randint(1, 6))  # 6

cards = ["A", "R", "D", "V"]
rng.shuffle(cards)
print(cards)

Une instance avec une graine facilite la répétition d'une simulation. random ne convient pas à la génération de secrets.

Parallèle C# et .NET

var rng = new Random(42);
Console.WriteLine(rng.Next(1, 7)); // De 1 à 6 inclus
string[] cards = { "A", "R", "D", "V" };
for (int i = cards.Length - 1; i > 0; i--)
{
    int j = rng.Next(i + 1);
    (cards[i], cards[j]) = (cards[j], cards[i]);
}
Console.WriteLine(string.Join(", ", cards));

Random.Next(min, max) exclut la borne supérieure, alors que randint() l’inclut. NextDouble() se rapproche de random(). Le mélange montré est un Fisher-Yates. Une même graine ne produit pas les mêmes suites en Python et en .NET ; leur stabilité dépend aussi des garanties de la version et de l’API. Utilisons RandomNumberGenerator pour des secrets.