Значение эпсилон в Python

Существует ли стандартное значение (или метод получения) эпсилон в Python? Мне нужно сравнить значения с плавающей запятой и я хочу сравнить с наименьшей возможной разницей.

В C++ есть функция numeric_limits::epsilon( ), которая дает значение эпсилон для любого заданного типа данных. Есть ли аналог в Python?


person thornate    schedule 02.03.2012    source источник
comment
При сравнении чисел с плавающей запятой величина значений будет влиять на эпсилон.   -  person John La Rooy    schedule 02.03.2012
comment
Учтите также, что ошибка в значениях может распространяться между операциями. Направление Численный анализ посвящено изучению этого. На на этом сайте также есть несколько полезных правил.   -  person Casey Kuball    schedule 10.05.2012
comment
В качестве примера к комментарию людей выше, 1e300-(1e300-1e200) возвращает 0.0, где фактическая разница должна быть 10 ^ 200.   -  person THN    schedule 28.09.2018


Ответы (4)


Информация доступна в sys.float_info, что соответствует float.h в C99.

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
person strcat    schedule 02.03.2012

Как опубликовано strcat, есть sys.float_info.epsilon.

Но не забывайте о подводных камнях использования его в качестве абсолютной погрешности для сравнений с плавающей запятой. Например. для больших чисел ошибка округления может превышать эпсилон.

Если вы считаете, что вам нужно освежить в памяти, стандартный справочник — это What Каждый компьютерный ученый должен знать об арифметике с плавающей запятой, или для более простого обзора вы можете проверить Руководство по работе с плавающей запятой.

person Ergwun    schedule 02.03.2012

Если вы не можете найти функцию для этого, помните, что алгоритм вычисления машинного эпсилон очень прост (вы можете протестировать его на своем любимом языке программирования). Например, для python:

eps = 1.0
while eps + 1 > 1:
    eps /= 2
eps *= 2
print("The machine epsilon is:", eps)

В моем случае я получил:

The machine epsilon is: 2.220446049250313e-16

person s.ouchene    schedule 20.08.2019
comment
хороший способ генерировать eps, но почему вы называете это машинной точностью? - person gfdsal; 03.07.2020
comment
@gfdsal: Спасибо, я думаю, что машинный эпсилон должен быть точным термином. - person s.ouchene; 03.07.2020

Удивлен, что никто не упомянул об этом здесь; Я думаю, что многие люди использовали бы numpy.finfo( type(variable) ) .eps вместо этого. Или .resolution, если нужно оценить точность.

Обратите внимание, что finfo предназначен только для типов с плавающей запятой, и что он также работает с собственным типом Python float (т.е. не ограничивается типами numpy). Эквивалентом целочисленных типов является iinfo, хотя это не так. не содержат точной информации (потому что, ну зачем она?).

person Jonathan H    schedule 02.03.2018
comment
Не согласен с большинством людей: не все используют NumPy. Если вам нужен эпсилон для Python float, используйте sys.float_info; было бы странно использовать NumPy только для этого. Если вам нужны значения для типов NumPy (np.float32, np.float64 и т. д.), используйте numpy.finfo. - person Mark Dickinson; 03.03.2018
comment
Изменил формулировку. Чтобы уточнить, np.finfo(float) действительно работает, но я согласен, что если вы никогда не используете numpy, то было бы излишним устанавливать пакет только для этого. - person Jonathan H; 03.03.2018
comment
Правильно, но np.finfo(float) немного вводит в заблуждение, поскольку NumPy немедленно преобразует float в np.float64, а затем сообщает об этом подробности. Таким образом, он снова сообщает о типе NumPy, а не о float Python. (Хотя, по общему признанию, весьма вероятно, что float и np.float64 являются одним и тем же форматом: они оба используют двойные C под капотом.) - person Mark Dickinson; 03.03.2018