← Все вопросы
Почему 1/0 даёт ZeroDivisionError, а 1e308 * 10 — OverflowError или inf?
7
Разбираюсь с ошибками деления и переполнения. 1/0 кидает ZeroDivisionError, а вот что происходит при делении float на ноль и при очень больших float? Когда вылетает OverflowError, а когда просто inf?
3 ответа
19
✓ Принятый ответ — помог автору
Тут несколько разных случаев, легко спутать:
Деление на ноль:
1 / 0и5 // 0,5 % 0→ZeroDivisionError. Целое деление на ноль — всегда исключение.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 — это не ошибка.
Ваш ответ
Войдите, чтобы ответить на вопрос.