← Все вопросы

Почему 1/0 даёт ZeroDivisionError, а 1e308 * 10 — OverflowError или inf?

Задан 18 месяцев назад313 просмотров3 ответа
7

Разбираюсь с ошибками деления и переполнения. 1/0 кидает ZeroDivisionError, а вот что происходит при делении float на ноль и при очень больших float? Когда вылетает OverflowError, а когда просто inf?

3 ответа

19
✓ Принятый ответ — помог автору

Тут несколько разных случаев, легко спутать:

Деление на ноль:

  • 1 / 0 и 5 // 0, 5 % 0ZeroDivisionError. Целое деление на ноль — всегда исключение.
  • 1.0 / 0.0 → тоже ZeroDivisionError: float division by zero. То есть деление на ноль в Python всегда ошибка, даже для float (в отличие от чистого IEEE-754, где было бы inf).

Переполнение:

  • Целые числа в Python не переполняются вообще — они «длинные» (bignum), 10**1000 просто посчитается.
  • А вот float ограничен. 1e308 * 10 уже не влезает и даёт inf (бесконечность), БЕЗ ошибки.
  • OverflowError вы поймаете, например, при попытке превратить слишком большое целое во float: float(10**400)OverflowError: int too large to convert to float, или в math.exp(1000).

Итого: деление на ноль — исключение; «слишком большой float» — обычно inf без ошибки; OverflowError — на границе int↔float и в некоторых функциях math.

lombord code Важный момент: целые в питоне неограниченные, поэтому OverflowError на них не бывает. · 17 месяцев назад
6

Деление на ноль (и для int, и для float) — это ZeroDivisionError. Большой float сам по себе становится inf без ошибки.

3

Целые не переполняются. inf — это не ошибка.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект