Fonction math.ulp() de Python
Dans les calculs en virgule flottante, comprendreles limites de précision des nombres à virgule flottanteest très important. ULP (Unit in the Last Place) est l'unité de base pour mesurer la précision des nombres à virgule flottante.
math.ulp()est une fonction introduite dans Python 3.9, utilisée pour renvoyerla plus petite unité significative de nombre à virgule flottante(ULP), c'est-à-dire la distance entre ce nombre et le nombre à virgule flottante représentable suivant.
Définition du mot: ulpest l'abréviation de « Unit in the Last Place », qui signifie « l'unité de la dernière place ».
Syntaxe de base et paramètres
Format de syntaxe
import math math.ulp(x)
Description du paramètre
- x: nombre à virgule flottante
Valeur de retour
Renvoie la valeur ULP de x, c'est-à-dire la différence entre x et le prochain nombre à virgule flottante représentable
Exemples
Exemple 1 : Utilisation de base
Exemple
print("ULP de 1.0 :", math.ulp(1.0))
print("ULP de 2.0 :", math.ulp(2.0))
print("ULP de 100.0 :", math.ulp(100.0))
print("ULP de 0.0 :", math.ulp(0.0))
print("Plus petit nombre positif :", math.ulp(float.min)
Sortie :
1.0 的 ULP: 2.220446049250313e-16 2.0 的 ULP: 4.440892098500626e-16 100.0 的 ULP: 2.8421709430404007e-14 0.0 的 ULP: 5e-324
Exemple 2 : ULP pour différentes valeurs
Exemple
values = [0.1, 0.5, 1.0, 1.5, 2.0, 10.0, 100.0, 1000.0]
print("ULP pour différentes valeurs :")
for x in values:
print(f" ULP({x}) = {math.ulp(x)}")
Sortie :
不同数值的 ULP: ULP(0.1) = 1.3877787807814457e-17 ULP(0.5) = 1.3877787807814457e-16 ULP(1.0) = 2.220446049250313e-16 ULP(1.5) = 2.220446049250313e-16 ULP(2.0) = 4.440892098500626e-16 U浮点 10.0: 2.220446049250313e-15 ULP(100.0) = 2.8421709430404007e-14 ULP(1000.0) = 2.2737367544323206e-13
Exemple 3 : Valeurs spéciales
Exemple
print("Infini :", math.ulp(math.inf))
print("Plus grand nombre fini :", math.ulp(sys.float_info.max))
print("Nombre négatif :", math.ulp(-1.0))
print("Nombre sous-normal :", math.ulp(1e-310))
Sortie :
无穷大: inf 最大有限数: inf 负数: 2.220446049250313e-16 次正规数: 5e-324
Exemple 4 : Détection de la précision des nombres à virgule flottante
Exemple
def check_precision(x):
"""Détecter la précision des nombres à virgule flottante"""
ulp = math.ulp(x)
relative_error = ulp / x
print(f"x = {x}")
print(f" ULP = {ulp}")
print(f" Erreur relative ≈ {relative_error:.2e}")
print(f" Chiffres significatifs ≈ {-math.log2(relative_error):.1f}")
print()
check_precision(1.0)
check_precision(1000000.0)
Sortie :
x = 1.0 ULP = 2.220446049250313e-16 相对误差 ≈ 2.22e-16 有效位数 ≈ 52.0 x = 1000000.0 ULP = 1.907344663e-13 相对误差 ≈ 1.91e-13 有效位数 ≈ 52.0
Exemple 5 : Combinaison avec nextafter
Exemple
# Vérifier : nextafter(x, inf) - x = ULP(x)
x = 1.0
next_val = math.nextafter(x, math.inf)
ulp_calc = math.ulp(x)
direct_diff = next_val - x
print(f"x = {x}")
print(f"nextafter(x, inf) - x = {direct_diff}")
print(f"math.ulp(x) = {ulp_calc}")
print(f"Égal : {direct_diff == ulp_calc}")
Sortie :
x = 1.0 nextafter(x, inf) - x = 2.220446049250313e-16 math.ulp(x) = 2.220 double 000001e-16 两者相等: True
Remarque: math.ulp(x) est équivalent à |nextafter(x, inf) - x|
Scénarios d'application
- Analyse des erreurs des algorithmes numériques
- Détection de la précision en virgule flottante
- Réglage de la tolérance en calcul scientifique
- Déterminer un epsilon approprié lors de la comparaison de nombres à virgule flottante
Notes
- Cette fonction n'est disponible qu'à partir de Python 3.9+
- La valeur de l'ULP augmente à mesure que le nombre augmente
- L'ULP de inf est également inf
Autres extensions
Module math de Python