Арифметика

Компьютерная арифметика

Человек, который спас миллиарды долларов: Уильям Кахан

В **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:**

ТипБитыТочностьДиапазон
float32~7 цифр±3.4×10³⁸
double64~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?
  • В каких областях ошибки округления особенно опасны?

Связанные уроки

  • arch-01-binary
Компьютерная арифметика

0

1

Войти