Играет ли память по умолчанию, выделенная для типа данных, роль в округлении? Каким образом число с плавающей запятой округляется, если оно превышает выделенную память? - PullRequest
0 голосов
/ 05 мая 2018

Наличие файла test2.py со следующим содержимым:

print(2.0000000000000003)    
print(2.0000000000000002)

Я получаю этот вывод:

$ python3 test2.py  

2.0000000000000004  
2.0    

Я думал, что это может быть вызвано нехваткой памяти, выделенной для float, но 2.0000000000000003 и 2.0000000000000002 требуют одинакового объема памяти.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

IEEE 754 64-разрядная двоичная с плавающей запятой всегда использует 64-разрядную для хранения числа. Он может точно представлять конечное подмножество двоичных дробей. Если смотреть только на нормальные числа, то если N является степенью двойки в своем диапазоне, он может представлять число вида в двоичном виде, 1.s*N, где s - строка из 52 нулей и единиц.

Все 32-битные двоичные целые числа, включая 2, являются точно представимыми.

Наименьшее точно представимое число, большее 2, равно 2.000000000000000444089209850062616169452667236328125. Это вдвое больше двоичной дроби 1.0000000000000000000000000000000000000000000000000000000000000001.

2.0000000000000003 ближе к 2.000000000000000444089209850062616169452667236328125, чем к 2, поэтому округляется и печатается как 2.0000000000000004.

2.0000000000000002 ближе к 2,0, поэтому округляется до 2,0.

Для хранения чисел от 2,0 до 2,000000000000000444089209850062616169452667236328125 потребуется другой формат с плавающей запятой, который, вероятно, займет более 64 бит для каждого числа.

0 голосов
/ 05 мая 2018

Плавания не сохраняются как целые числа, каждый бит сигнализирует о да / нет члене 1,2,4,8,16,32, ... значение, которое вы складываете, чтобы получить полное число. Они хранятся как sign + mantissa + exponent в базе 2. Несколько комбинаций имеют особое значение (NaN, + -inf, -0, ...). Положительные и отрицательные числа идентичны по мантиссе и показателю степени, отличается только знак.

В любой момент времени они имеют определенной битовой длины , в которую они "помещаются". Они не могут переполниться.

Однако они имеют минимальную точность: если вы попытаетесь вписать в них числа, которые требуют большей точности, вы получите ошибки округления - это то, что вы видите в своем примере.

Подробнее о поплавках и хранении (с примером):

Подробнее о точности поплавков: - Арифметика с плавающей запятой: проблемы и ограничения

...