Función math.ulp() de Python
En el cálculo de números de punto flotante, comprenderla limitación de precisión de los números de punto flotantees muy importante. ULP (Unit in the Last Place) es la unidad básica para medir la precisión de los números de punto flotante.
math.ulp()math.ulp() es una función introducida en Python 3.9, que se utiliza para devolver launidad mínima significativa de punto flotante(ULP), es decir, la distancia desde ese número hasta el siguiente número de punto flotante representable.
Definición de la palabra: ulpEs la abreviatura de "Unit in the Last Place", que significa "unidad del último dígito".
Sintaxis básica y parámetros
Formato de sintaxis
import math math.ulp(x)
Descripción de parámetros
- x: número de punto flotante
Valor de retorno
Devuelve el valor ULP de x, es decir, la diferencia entre x y el siguiente número de punto flotante representable.
Ejemplos
Ejemplo 1: Uso básico
Ejemplo
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("Número positivo más pequeño:", math.ulp(float.min)
Resultado de la ejecución:
1.0 的 ULP: 2.220446049250313e-16 2.0 的 ULP: 4.440892098500626e-16 100.0 的 ULP: 2.8421709430404007e-14 0.0 的 ULP: 5e-324
Ejemplo 2: ULP de diferentes valores
Ejemplo
values = [0.1, 0.5, 1.0, 1.5, 2.0, 10.0, 100.0, 1000.0]
print("ULP de diferentes valores:")
for x in values:
print(f" ULP({x}) = {math.ulp(x)}")
Resultado de la ejecución:
不同数值的 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
Ejemplo 3: Valores especiales
Ejemplo
print("Infinito:", math.ulp(math.inf))
print("Número finito máximo:", math.ulp(sys.float_info.max))
print("Número negativo:", math.ulp(-1.0))
print("Número subnormal:", math.ulp(1e-310))
Resultado de la ejecución:
无穷大: inf 最大有限数: inf 负数: 2.220446049250313e-16 次正规数: 5e-324
Ejemplo 4: Detección de precisión de punto flotante
Ejemplo
def check_precision(x):
"""Detección de precisión de punto flotante"""
ulp = math.ulp(x)
relative_error = ulp / x
print(f"x = {x}")
print(f" ULP = {ulp}")
print(f" Error relativo ≈ {relative_error:.2e}")
print(f" Cifras significativas ≈ {-math.log2(relative_error):.1f}")
print()
check_precision(1.0)
check_precision(1000000.0)
Resultado de la ejecución:
x = 1.0 ULP = 2.220446049250313e-16 相对误差 ≈ 2.22e-16 有效位数 ≈ 52.0 x = 1000000.0 ULP = 1.907344663e-13 相对误差 ≈ 1.91e-13 有效位数 ≈ 52.0
Ejemplo 5: Combinación con nextafter
Ejemplo
# Verificación: 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"Ambos son iguales: {direct_diff == ulp_calc}")
Resultado de la ejecución:
x = 1.0 nextafter(x, inf) - x = 2.220446049250313e-16 math.ulp(x) = 2.220 double 000001e-16 两者相等: True
Nota: math.ulp(x) es equivalente a |nextafter(x, inf) - x|
Escenarios de aplicación
- Análisis de errores en algoritmos numéricos
- Detección de precisión de punto flotante
- Configuración de tolerancia en cálculo científico
- Determinar el épsilon adecuado al comparar números de punto flotante
Precauciones
- Esta función solo está disponible en Python 3.9+
- El valor de ULP aumenta a medida que aumenta el número
- El ULP de inf también es inf
Otras extensiones
Módulo math de Python