Нет, компьютер точен, тут дело в другом.
Как известно, компьютер, калькулятор и подобные вычислительные машины работают на нашем любимом электричестве.
При этом как-то надо с помощью этого электричества хранить и обрабатывать различные числа. Сделать это можно по разному, но создатели цифровой техники пошли по самому простому пути: обозначили нулем отсутствие электричества, а наличие - единицей.
Поскольку таким путем можно обозначить только две цифры: 0 и 1, эту систему счисления назвали двоичной. Она оказалась настолько удобной для конструирования разных вычислительных устройств, что сегодня применяется практически везде.
Тем не менее, можно создать устройства, работающие в любых других системах счисления, если это понадобится.
Когда мы даем Python какое-то число, он для себя преобразует его в двоичную систему, а нам показывает в десятичной. Чтобы мы ничего не заподозрили.
Но тщетно: мы заподозрили.
Встроенная функция bin() позволяет увидеть двоичное представление целого числа.
Чтобы не спутать двоичное представления числа с обычным, в начало добавляются символы 0b:
print(bin(10000)) |
0b10011100010000 |
print(bin(0)) |
0b0 |
Видишь, у нас круглые числа - это степени десятки: 1,10,100... А тут это степени двойки: 1,2,4,8...
Двоичная система счисления играет огромную роль в современной науке и технике, а в последнее время - и в искусстве. Она даже вдохновила А.Старикова на следующие строки. Сможешь ли ты понять, о чем тут идет речь?
Ей было 1100 лет,
Она в 101 класс ходила,
В портфеле по 100 книг носила –
Все это правда, а не бред,
Когда пыля десятком ног,
Она шагала по дороге,
За ней всегда бежал щенок
С одним хвостом, зато стоногий
Она ловила каждый звук
Своими десятью ушами
И десять загорелых рук
Портфель и поводок держали.
И десять темно-синих глаз
Рассматривали мир привычно,
Но станет все совсем обычным,
Когда поймешь ты наш рассказ.
И дроби в двоичной системе состоят не из суммы 0.1, 0.01, 0.001 а из суммы 1/2, 1/4, 1/8 и т.п.
Соответственно, записать точно в двоичной системе можно только дробь 1/2 (0b0.1), 1/4 (0b0.01) и так далее.
Потому, хотя внешне выглядит все прилично, выисления только с этими дробями компьютер осуществит по-настоящему, без потери точности.
А десятичная дробь 0.1 = 1/10 к ним явно не относится.
Это, кстати, можно проверить экспериментально.
print(0.1) |
0.1 |
Все дроби хорошие, кругленькие, но возведем-ка их, скажем, в десятую степень!
print(0.1**10) |
1.0000000000000006e-10 |
Тут-то оно и видно, что только 1/2 = 0.5 обработалась точно. Ничего страшного в этом нет - ошибка ведь составляет ничтожную величину. Просто будем это иметь в виду.
Но вот что за странные числа: 5.9048999999999975e-06 и подообные...
Что же это "e-06" означет?