user1410
@user1410
Изучаю JavaScript

Что такое машинный эпсилон?

Изучаю Python по книге Саммерфильда Programming in Python 3 (A Complete Introduction to the Python Language)

Дошел до машинного эпсилона.

В питоне есть sys.float_info.epsilon и эта величина является машинным эпсилоном. Это я понял.

Так же я понял, что существуют значения меньше машинного эпсилона, но с этими значениями компьютер работает не точно.

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

x = sys.float_info.epsilon
'''
this is how to work machine epsilon
1.0 + x != 1.0
1.0 + x/2 == 1.0
'''
print (1.0 + x) # output will be 1.0000000000000002  
print (1.0 + x/2) # output will be 1.0


Итого у меня два вопроса:
1) Правильно ли я понимаю, что машинный эпсилон это минимальная разница между двумя числами, с которой компьютер может работать без погрешностей?

2) Машинный эпсилон и машинный ноль это синонимы?
  • Вопрос задан
  • 16604 просмотра
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs
C++ developer
Корректное определение звучит так:
FLT_EPSILON: This is the difference between 1 and the smallest floating point number of type float that is greater than 1.

Разница между 1 и минимальным чилом представимым в float большим 1. Говорить о том, что:
Машинный эпсилон - это минимальная разница между числами, которую компьютер в состоянии различить.

не правильно, потому, что как вы заметили, числа меньше FLT_EPSILON вполне представимы в float и вы вполне можете с ними работать.
Дело в том, что плотность чисел представимых в float не постоянна. Расстояние между 2 такими соседними числами может быть меньше FLT_EPSILON в окресности нуля. И наоборот для значений близких к MAX_FLOAT разница между соседними значениями может быть больше 1.
В python тип float соответствует типу двойной точности(64 бита) и в нем представимы все целые числа. Если же воспользоваться 32-битным вариантом, то можно получить "странное" поведение. Следующий код зацикливается.
import sys
from numpy import float32
a = float32(sys.float_info.max)
while a > sys.float_info.max - 10000:
   a -= 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы