Функция math.ulp() в Python

Python math 模块Модуль math в Python


В вычислениях с плавающей запятой очень важно пониматьограничения точности чисел с плавающей запятой. ULP (Unit in the Last Place) — это базовая единица для измерения точности чисел с плавающей запятой.

math.ulp()— это функция, появившаяся в Python 3.9, которая используется для возвратанаименьшей значащей единицы числа с плавающей запятой(ULP), то есть расстояния от этого числа до следующего представимого числа с плавающей запятой.

Определение слова: ulp— это сокращение от "Unit in the Last Place", означающее "единица последнего разряда".


Базовый синтаксис и параметры

Формат синтаксиса

import math

math.ulp(x)

Описание параметра

  • x: число с плавающей запятой

Возвращаемое значение

Возвращает значение ULP для x, то есть разницу между x и следующим представимым числом с плавающей запятой


Примеры

Пример 1: Базовое использование

Пример

import math

print("ULP для 1.0:", math.ulp(1.0))
print("ULP для 2.0:", math.ulp(2.0))
print("ULP для 100.0:", math.ulp(100.0))
print("ULP для 0.0:", math.ulp(0.0))
print("Наименьшее положительное число:", math.ulp(float.min)

Вывод:

1.0 的 ULP: 2.220446049250313e-16
2.0 的 ULP: 4.440892098500626e-16
100.0 的 ULP: 2.8421709430404007e-14
0.0 的 ULP: 5e-324

Пример 2: ULP для разных значений

Пример

import math

values = [0.1, 0.5, 1.0, 1.5, 2.0, 10.0, 100.0, 1000.0]
print("ULP для разных значений:")
for x in values:
    print(f" ULP({x}) = {math.ulp(x)}")

Вывод:

不同数值的 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

Пример 3: Специальные значения

Пример

import math

print("Бесконечность:", math.ulp(math.inf))
print("Наибольшее конечное число:", math.ulp(sys.float_info.max))
print("Отрицательное число:", math.ulp(-1.0))
print("Субнормальное число:", math.ulp(1e-310))

Вывод:

无穷大: inf
最大有限数: inf
负数: 2.220446049250313e-16
次正规数: 5e-324

Пример 4: Определение точности чисел с плавающей запятой

Пример

import math

def check_precision(x):
    """Определить точность чисел с плавающей запятой"""
    ulp = math.ulp(x)
    relative_error = ulp / x
    print(f"x = {x}")
    print(f" ULP = {ulp}")
    print(f" Относительная погрешность ≈ {relative_error:.2e}")
    print(f" Значащие цифры ≈ {-math.log2(relative_error):.1f}")
    print()

check_precision(1.0)
check_precision(1000000.0)

Вывод:

x = 1.0
  ULP = 2.220446049250313e-16
  相对误差 ≈ 2.22e-16
  有效位数 ≈ 52.0

x = 1000000.0
  ULP = 1.907344663e-13
  相对误差 ≈ 1.91e-13
  有效位数 ≈ 52.0

Пример 5: Комбинирование с nextafter

Пример

import math

# Проверка: 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"Равно: {direct_diff == ulp_calc}")

Вывод:

x = 1.0
nextafter(x, inf) - x = 2.220446049250313e-16
math.ulp(x) = 2.220 double 000001e-16
两者相等: True

Примечание: math.ulp(x) эквивалентно |nextafter(x, inf) - x|


Сценарии применения

  • Анализ погрешностей численных алгоритмов
  • Определение точности чисел с плавающей запятой
  • Настройка допуска в научных вычислениях
  • Определение подходящего значения эпсилон при сравнении чисел с плавающей запятой

Примечания

  • Эта функция доступна только в Python 3.9+
  • Значение ULP увеличивается по мере увеличения числа
  • ULP для inf также равен inf

Python math 模块Модуль math в Python

Другие расширения