gadget59.ru · лекция Численные методы · Лекция 1 · 30 слайдов
01

Лекция №1: Элементы теории погрешностей

От «почему 0.1 + 0.2 ≠ 0.3» до реальных катастроф в IT

ОП.10 Численные методы · Специальность 09.02.07 «Информационные системы и программирование»
Лекция 1 · 2 академических часа (90 минут)

Добро пожаловать на первую лекцию курса. Сегодня мы заложим фундамент всего курса — разберёмся, почему компьютеры ошибаются, откуда берутся эти ошибки и как будущему программисту научиться с ними жить.

📐 Погрешности 🔢 IEEE 754 💻 float / double 🐍 Python ⚠️ Баги 🎯 Точность
02

Зачем программисту знать про погрешности?

На первый взгляд кажется, что погрешности — это «скучная математика», которая нужна только учёным. Но на деле это одна из самых частых причин багов в реальном программном обеспечении.

Практические причины

Главная мысль

Программист обязан понимать, как компьютер хранит числа и где могут накапливаться ошибки. Иначе ваш код однажды может «промахнуться на 600 метров» — в финансах, медицине, транспорте или играх.

03

План лекции

Что мы разберём за одну пару:

  1. Зачем программисту знать про погрешности (реальный кейс из истории).
  2. Истинное и приближённое значение числа.
  3. Абсолютная и относительная погрешность.
  4. Классификация источников погрешностей.
  5. Как ЭВМ хранит числа: стандарт IEEE 754.
  6. Машинный эпсилон — «предел точности» компьютера.
  7. Катастрофическая потеря значимости.
  8. Демонстрация на Python: почему 0.1 + 0.2 ≠ 0.3.
  9. Как правильно сравнивать числа с плавающей точкой.
  10. Правила арифметики приближённых чисел.
  11. Анонс практической работы №1.
  12. Вопросы для самопроверки и итоги.
04

Кейс: система ПРО Patriot (25 февраля 1991 года)

Во время войны в Персидском заливе американская зенитная ракетная система Patriot (ПРО — противоракетная оборона) не смогла перехватить иракскую ракету «Скад». В результате погибло 28 американских солдат.

Причина — в программном коде

Вывод: крошечная ошибка округления → гибель людей. Это не теория, это реальность.

05

Истинное и приближённое значение

Прежде чем говорить о погрешностях, нужно договориться о терминах. В численных методах мы всегда имеем дело с двумя величинами.

Истинное значение (X)

Точное значение величины, которое мы хотели бы узнать. В большинстве реальных задач оно нам неизвестно.

Пример: истинное расстояние до Луны, истинное значение числа π.

Приближённое значение (x)

То значение, которое мы получили в результате измерения, вычисления или которое хранится в памяти компьютера.

Пример: 3.14159265358979 — приближение π.

Компьютер не может хранить бесконечное число знаков. Поэтому любое число в памяти — это приближение.

06

Абсолютная погрешность

Абсолютная погрешность (Δ) — это модуль разности между истинным и приближённым значениями:

Δ = |X − x|

Она показывает, на сколько единиц мы ошиблись. Измеряется в тех же единицах, что и сама величина: метры, секунды, рубли.

Пример

Измерили длину стола линейкой: получили 120 см. Истинная длина — 120.3 см.

Но если мы измеряем расстояние до Луны (384 000 км) с ошибкой в 1 км — это тоже абсолютная погрешность 1 км. Звучит страшнее, но по сути это гораздо более точное измерение.

07

Относительная погрешность

Чтобы понять, насколько плохо мы ошиблись, одной абсолютной погрешности недостаточно. Нужно сравнить её с самой величиной.

Относительная погрешность (δ) — отношение абсолютной погрешности к модулю приближённого значения. Обычно выражается в процентах:

δ = (Δ / |x|) × 100%

Запомните: в программировании, когда вы видите «точность вычислений 10⁻⁹» — это почти всегда относительная погрешность. Именно её задают в алгоритмах поиска корней, интегрирования и решения дифференциальных уравнений.

08

Пример: сравниваем два измерения

Измерение Абсолютная погрешность Относительная погрешность
Длина стола (1 м) 1 см 1%
Расстояние до Луны (384 000 км) 1 км 0.00026%

Абсолютные погрешности близки (1 см и 1 км), но относительные отличаются в тысячи раз.

Именно поэтому в IT и науке чаще используют относительную погрешность — она масштабируется и позволяет сравнивать точность измерений разного порядка.

09

Классификация источников погрешностей

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

1. Неустранимая

Погрешность исходных данных. Возникает ещё до написания кода.

2. Методическая

Погрешность метода. Замена точного процесса приближённым.

3. Вычислительная

Погрешность округления. «Родная» погрешность программиста.

Разберём каждую подробнее.

10

1. Неустранимая погрешность

Она возникает ещё до того, как вы написали хоть строчку кода.

Причины

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

11

2. Методическая погрешность

Возникает из-за того, что мы заменяем точный математический процесс приближённым.

Примеры

Методическую погрешность можно уменьшить, выбрав более точный метод или увеличив число шагов. Но полностью устранить — нельзя.

12

3. Вычислительная погрешность (округления)

Это «родная» погрешность программиста. Она возникает из-за того, что память ЭВМ (электронно-вычислительной машины) конечна: компьютер не может хранить бесконечное число знаков.

Каждое действие (сложение, умножение) может вносить микроскопическую ошибку округления.

Именно эта погрешность привела к катастрофе с Patriot. Именно её мы будем разбирать подробнее всего.

Чтобы понять, откуда берутся ошибки округления, нужно заглянуть «под капот» компьютера — к стандарту IEEE 754.

13

Как ЭВМ хранит числа: стандарт IEEE 754

Все современные компьютеры хранят вещественные (дробные) числа по стандарту IEEE 754 (Institute of Electrical and Electronics Engineers — Институт инженеров по электротехнике и электронике, стандарт 754).

Любое вещественное число в IEEE 754 хранится в виде трёх частей:

число = (−1)^знак × 1.мантисса × 2^порядок

14

Два основных формата

Параметр float (одинарная точность) double (двойная точность)
Размер в памяти 32 бита (4 байта) 64 бита (8 байт)
Бит на мантиссу 23 бита 52 бита
Примерный диапазон ±3.4 × 10³⁸ ±1.7 × 10³⁰⁸
Точность (знаков) ≈ 7 десятичных ≈ 15–16 десятичных
Где используется Игры, графика, C float Python, Java double

В Python все «обычные» дробные числа — это double (64 бита).

15

Почему 0.1 не хранится точно?

В десятичной системе дробь 1/3 = 0.33333… — бесконечная. В двоичной системе роль «проблемных» дробей играют числа, знаменатель которых не является степенью двойки.

Дробь 0.1 = 1/10 — именно такая.

В двоичном виде 0.1 выглядит так:

0.00011001100110011001100110011…

Это бесконечная периодическая дробь. Компьютер вынужден её обрезать до 52 знаков мантиссы (для double). И вот это обрезание и есть источник всех бед.

16

Машинный эпсилон

Машинный эпсилон (ε) — это минимальное число, которое при прибавлении к единице даёт результат, строго больший 1. Проще говоря, это «предел чувствительности» компьютера к изменениям.

Что это значит на практике? Если вы прибавите к числу 1.0 что-то меньшее, чем эпсилон, компьютер «не заметит» этого прибавления.

Машинный эпсилон — это характеристика не задачи, а самого компьютера. Его нельзя улучшить, можно только перейти на более ёмкий тип данных.

17

Катастрофическая потеря значимости

Есть операция, которая особенно опасна для точности: вычитание двух близких чисел.

Представьте, что у вас есть два числа:

Разность: x − y = 0.0000001. Но в этом результате все старшие значащие цифры сократились, и на свет «выплыли» младшие разряды, которые на самом деле были зашумлены округлением.

Относительная погрешность результата может оказаться огромной, даже если исходные числа были точными. Это явление называется катастрофической потерей значимости.

18

Демонстрация на Python: классическая ловушка

Откроем Python и посмотрим, как теория превращается в баги.

a = 0.1
b = 0.2
print(a + b)          # Вывод: 0.30000000000000004
print(a + b == 0.3)   # Вывод: False!

Что произошло? Числа 0.1 и 0.2 не могут быть точно представлены в двоичной памяти. При их сложении ошибки округления накапливаются.

Это значит, что условие if a + b == 0.3: никогда не сработает. Это одна из самых частых причин багов в финансовых приложениях, играх и научных расчётах.

19

Как это исправить (Best Practice)

Вместо точного сравнения нужно сравнивать числа в пределах заданной точности:

import math

a = 0.1
b = 0.2
epsilon = 1e-9  # наша допустимая погрешность

if math.isclose(a + b, 0.3, abs_tol=epsilon):
    print("Числа равны в пределах заданной точности!")
else:
    print("Числа различаются")

Функция math.isclose() — это стандартный способ сравнивать числа с плавающей точкой в Python. Она учитывает и абсолютную, и относительную погрешность.

20

Накопление ошибки в цикле

s = 0.0
for i in range(1000):
    s += 0.1

print(s)            # 99.99999999999861 (а не 100.0!)
print(s == 100.0)   # False

Мы тысячу раз прибавили 0.1 и ожидали получить 100. Но из-за накопления ошибок округления результат «уплыл».

Это классический пример того, как маленькая погрешность превращается в большую. В реальных программах такие циклы могут выполняться миллионы раз — и ошибка становится критичной.

21

Как правильно сравнивать числа с плавающей точкой

Запомните золотое правило программиста: никогда не сравнивайте числа типа float и double через оператор ==.

Плохо (так делать нельзя):

if price == 100.0:        # ❌ Никогда не сработает
    print("Ровно 100")

Хорошо (правильный способ):

epsilon = 1e-9
if abs(price - 100.0) < epsilon:   # ✅ Работает всегда
    print("Практически 100")
22

Отлично (для денег): тип Decimal

Если вы работаете с финансами, не используйте float и double вообще. В Python есть специальный тип Decimal, который хранит числа как строки десятичных цифр:

from decimal import Decimal

a = Decimal('0.1')
b = Decimal('0.2')
print(a + b)          # 0.3 — ровно!
print(a + b == Decimal('0.3'))  # True

Именно Decimal используется в банковских системах, бухгалтерии и везде, где важна копейка.

23

Правила арифметики приближённых чисел

Когда мы выполняем действия над приближёнными числами, погрешности тоже складываются, умножаются и делятся.

Правило 1: Сложение и вычитание

В результате сохраняют столько десятичных знаков после запятой, сколько их в числе с наименьшим количеством таких знаков.

Пример: 12.34 + 5.6789 = 18.02 (а не 18.0189).

Правило 2: Умножение и деление

В результате сохраняют столько значащих цифр, сколько их в числе с наименьшим количеством значащих цифр.

Пример: 12.3 × 4.567 = 56.2 (3 значащих цифры).

24

Анонс практической работы №1

На следующей паре мы проведём Практическую работу №1 по теме «Вычисление погрешностей результатов арифметических действий над приближёнными числами» (4 академических часа).

Что вас ждёт

К практической работе нужно подготовиться: повторить правила действий с приближёнными числами и установить Python на домашний компьютер.

25

Вопросы для самопроверки (часть 1)

  1. Что такое истинное значение и приближённое значение? Чем они отличаются?
  2. Дайте определение абсолютной погрешности. В каких единицах она измеряется?
  3. Дайте определение относительной погрешности. Почему в IT она важнее абсолютной?
  4. Назовите три основных источника погрешностей в численных методах.
  5. Что такое стандарт IEEE 754? Какие два основных формата он определяет?
  6. Что такое машинный эпсилон? Чему он равен для float и double?
26

Вопросы для самопроверки (часть 2)

  1. Что такое катастрофическая потеря значимости? На какой операции она проявляется?
  2. Почему в Python 0.1 + 0.2 не равно 0.3?
  3. Как правильно сравнивать два числа с плавающей точкой?
  4. Какой тип данных в Python следует использовать для финансовых расчётов и почему?
  5. Сформулируйте правило сохранения знаков при сложении приближённых чисел.
  6. Сформулируйте правило сохранения знаков при умножении приближённых чисел.
27

Что должен уметь студент после этой лекции

После изучения этой темы и выполнения практической работы вы должны:

Знать

  • Методы хранения чисел в памяти ЭВМ.
  • Понятие абсолютной и относительной погрешности.
  • Классификацию источников погрешностей.
  • Стандарт IEEE 754.

Уметь

  • Вычислять абсолютную и относительную погрешность.
  • Применять правила арифметики приближённых чисел.
  • Писать код, корректно работающий с числами с плавающей точкой.

Понимать: почему компьютеры ошибаются и как эти ошибки влияют на реальные программы.

28

Домашнее задание

  1. Повторить правила действий с приближёнными числами (сложение, вычитание, умножение, деление).
  2. Решить 3 задачи на вычисление абсолютной и относительной погрешности (варианты будут выданы на практической работе).
  3. Творческое задание (со звёздочкой): написать на Python микро-программу, которая демонстрирует накопление ошибки округления в цикле. Например: прибавлять 0.1 к 0 тысячу раз и сравнить результат с 100.0. Вывести в консоль разницу.
  4. Прочитать в учебнике Лапчика М.П. «Элементы численных методов» главу 1 (раздел об источниках погрешностей).
29

Итоги лекции

Сегодня мы сделали самый важный шаг в курсе численных методов — поняли, что любое вычисление в компьютере по определению приближённое.

Краткое резюме

30

Главная мысль лекции

Численное решение в ЭВМ = Модель + Метод + Округление.
Программист обязан контролировать все три компонента.

Именно этим мы и будем заниматься весь семестр.

📐 Погрешности 🔢 IEEE 754 💻 float 🐍 Python 🎯 Точность

Спасибо за внимание!
До встречи на практической работе №1!