Обработка вещественных чисел

06.08.2021 0 Автор : Дмитрий Николаевич
Обработка вещественных чисел

Что такое вещественное число?

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

Вот, например, этот код:

x = 4.0
print(type(x))
Выведет
<class 'float'>

Это означает, что созданная переменная x относится к типу (классу) float. То есть, хранит вещественное число. Обратите внимание, что дробная часть этого числа равна нулю, но мы специально указали ее наличие с помощью точки. Это был сигнал для транслятора: «нужно создать вещественную переменную».

Очень большие или очень маленькие числа можно записывать в научном формате. Например, величину, равную заряда электрона (1,60217662 * 10-19 Кл), можно записать переменную так:

qElectron = 1.60217662e-19

Здесь первую часть (1,60217662) часто называют мантиссой или значащей частью числа, а «-19» после буквы e — это порядок числа.

Тот же принцип используется и для записи больших чисел. Расстояние от Земли до Солнца (1,496 * 1011 м) записывается в переменную distToSun как:
distToSun = 1.496e11

В памяти компьютера вещественные числа хранятся не так, как целые. Они тоже записываются в двоичном коде и представляются как сумма степеней числа 2. Но, в отличие от целых чисел, в эту сумму включают и отрицательные степени двойки, например:

4,375 = 22 + 2-2 + 2-3 = 100,0112.

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

К сожалению, многие вещественные числа, например 0,1 и 0,9, в двоичном коде записываются как бесконечные дроби. Поэтому при их записи в память остаются только первые биты, а остальные отбрасываются.

Эта проблема связана не с двоичной системой, а с ограниченным количеством бит, выделенных в памяти для хранения вещественного числа.

Вспомните, что число 1⁄3 не может быть точно записано в десятичной системе — его дробная часть содержит бесконечное число цифр. В компьютерах происходит то же самое.

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

Давайте рассмотрим программу, которая складывает числа 0,1 и 0,2 и зачем вычитает из суммы 0,3:

x = 0.1
y = 0.2
print(x + y)
diff = x + y - 0.3
print(diff)

Казалось бы, в математике мы должны получить 0, но программа выводит такой результат:

Результат выполнения кода
Первое число — это сумма значений x и y, которая должна быть равна 0,3, но немного отличается от этого значения из-за вычислительных ошибок. Второе число представляет значение 5,551115123125783 * 10-17 — это ошибка вычисления разности.