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.