Арифметика
Компьютерная арифметика
Человек, который спас миллиарды долларов: Уильям Кахан
В **1970-х годах** числа с плавающей точкой были хаосом. Каждый производитель - своя реализация. Программа, работающая на IBM, давала другие результаты на DEC. **Уильям Кахан**, профессор Беркли, посвятил жизнь борьбе с этим хаосом. В **1985 году** он возглавил создание стандарта **IEEE 754** - единого формата чисел для всех компьютеров. Intel, AMD, ARM - все используют его алгоритмы. Кахан получил Тьюринговскую премию в 1989 году - за то, что сделал вычисления предсказуемыми.
Никогда не игнорируй предупреждения о плавающей точке. Они там не для красоты. - Уильям Кахан
До IEEE 754 переносимость программ была мифом. После - один код работает одинаково везде. Каждый раз, когда видишь 0.30000000000000004 вместо 0.3 - это IEEE 754 честно показывает реальность. Без Кахана хаос продолжался бы по сей день.
В JavaScript: 0.1 + 0.2 = 0.30000000000000004. Баг? Нет, особенность. В 1991 году такая же "особенность" привела к гибели 28 солдат: система Patriot накопила ошибку за 100 часов работы и промахнулась мимо ракеты. В 1996 году overflow уничтожил ракету Ariane 5 стоимостью $370 млн за 37 секунд. Компьютерная арифметика - не то, чем кажется.
- **Финансы:** хранение цен в центах, не в float
- **Игры:** физические движки и коллизии
- **Наука:** численное моделирование климата, ядерных реакций
Переполнение целых чисел
**Integer overflow** - переполнение, когда результат операции не помещается в выделенную память. Число "оборачивается" через максимум и становится отрицательным (или наоборот).
**Диапазоны целых типов:** • int8: -128 ... 127 • int16: -32768 ... 32767 • int32: -2³¹ ... 2³¹-1 (≈ ±2 млрд) • int64: -2⁶³ ... 2⁶³-1 (≈ ±9×10¹⁸) **Беззнаковые (unsigned):** • uint8: 0 ... 255 • uint32: 0 ... 4,294,967,295
Overflow - причина реальных катастроф: от игровых багов до авиационных инцидентов. Программисты должны помнить о границах типов.
Что произойдёт при выполнении `uint8 x = 255; x = x + 1;`?
Числа с плавающей точкой
**Числа с плавающей точкой** (floating-point) представляют вещественные числа в научной нотации: знак × мантисса × 2^экспонента. Это позволяет хранить и очень большие, и очень маленькие числа.
**Научная нотация:** 6.022 × 10²³ (число Авогадро) = 6.022 (мантисса) × 10^23 (экспонента) **В двоичной форме:** 1.mantissa × 2^exponent **Типы:** • float (32 бита): ~7 значащих цифр • double (64 бита): ~15-16 значащих цифр
Плавающая точка - компромисс между диапазоном и точностью. Помни: это приближённые, не точные числа.
Почему 0.1 + 0.2 не равно точно 0.3 в большинстве языков программирования?
Стандарт IEEE 754
**IEEE 754** - международный стандарт представления чисел с плавающей точкой. Определяет форматы (float, double), особые значения (NaN, ∞) и правила округления.
**Форматы IEEE 754:**
| Тип | Биты | Точность | Диапазон |
|---|---|---|---|
| float | 32 | ~7 цифр | ±3.4×10³⁸ |
| double | 64 | ~15 цифр | ±1.8×10³⁰⁸ |
**Особые значения:** • +∞, -∞ - бесконечности • NaN - Not a Number (0/0, √-1) • +0, -0 - положительный и отрицательный ноль
IEEE 754 - результат компромиссов между диапазоном, точностью и скоростью. Понимание стандарта критично для численных вычислений.
Чему равно 0.0 / 0.0 по стандарту IEEE 754?
Проблемы точности
**Ошибки округления** накапливаются при вычислениях и могут привести к катастрофическим последствиям. Понимание источников ошибок критично для надёжного софта.
**Источники ошибок:** 1. **Представление:** 0.1 ≠ точно 0.1 2. **Округление:** каждая операция округляет 3. **Накопление:** ошибки суммируются 4. **Катастрофическая отмена:** вычитание близких чисел **Правила безопасности:** • Не сравнивать float напрямую • Избегать вычитания близких чисел • Использовать стабильные алгоритмы
Ошибки округления убивают людей и уничтожают ракеты. Числовая стабильность - не академический вопрос, а вопрос надёжности системы.
Компьютеры считают точно, ошибки - только от программистов
Конечная точность неизбежна; ошибки накапливаются в любых вычислениях
32 или 64 бита не могут представить бесконечное множество вещественных чисел. Любое хранимое число - приближение. Каждая операция вносит ошибку округления. За миллионы операций ошибки могут вырасти катастрофически. Это не баг, а фундаментальное ограничение цифровых вычислений.
Как безопаснее хранить цену $19.99 в программе?
Ключевые идеи
- Overflow: число "переворачивается" через максимум
- Float: знак × мантисса × 2^экспонента
- IEEE 754: стандарт, NaN, ±∞, машинный эпсилон
- Деньги храни в центах, сравнивай с epsilon
Связанные темы
Компьютерная арифметика связана с:
- Двоичная система — Основа представления
- Погрешности — Накопление ошибок
- Научная нотация — Формат чисел
Вопросы для размышления
- Почему языки не переключились на более точное представление чисел?
- Как бы вы тестировали программу на уязвимость к overflow?
- В каких областях ошибки округления особенно опасны?