Función math.ulp() de Python

Python math 模块Módulo math 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

import math

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

import math

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

import math

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

import math

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

import math

# 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

Python math 模块Módulo math de Python

Otras extensiones