Название float
происходит от того факта, что они являются числами с плавающей точкой .
Для упрощения floats
сохраняются как a * b ** c
, где a
, b
и c
каждый занимает определенное фиксированное число битов соответственно. Следовательно, интуитивно, если f
является числом с плавающей запятой, f * 10 ** 10
не займет намного больше места, чем f
, поскольку нам нужно только увеличить c
на log_2 log_2 (10 ** 10) = 5
(обычно b
является константой, например 2).
Обратная сторона этого, конечно, в том, что мы можем только когда-либо представлять определенное количество значащих цифр числами с плавающей запятой, поэтому через некоторое время вы сталкиваетесь с ошибками округления.
В Python ints
являются фиксированной точкой, произвольно точной и переменной шириной . Это означает, что int
может вырасти настолько большим, насколько вы хотите, с учетом ограничений памяти. Объем занимаемого им пространства пропорционален его величине, поскольку он должен хранить каждую отдельную цифру по отдельности (больше или меньше), а не вычислять по экспоненте, как в floats
. Следовательно, умножение int
i
на 10 ** 10
потребует log_2(10 ** 10) = 33
дополнительных битов.
Для полноты я бы отметил, что в чем-то вроде C
соответствующий int
, как и float
, является фиксированной шириной, и, следовательно, эквивалент sizeof
вернет одно и то же значение независимо от величины int
.