float
хранит значения с плавающей запятой, то есть значения с потенциальными десятичными знаками int
хранит только целые значения, то есть целые числа
Таким образом, хотя оба имеют ширину 32 бита, их использование (и представление) совершенно различны.Вы не можете хранить 3.141 в целом числе, но вы можете в float
.
Рассечь их обоих немного дальше:
В целом числе используются все битысохранить числовое значение.Это (в Java и на многих компьютерах тоже) сделано в так называемом дополнении до двух .В основном это означает, что вы можете представить значения от -2 31 до 2 31 - 1.
В формате с плавающей точкой эти 32 бита разделены между тремя различными частями: Бит знака, показатель степени и мантисса.Они расположены следующим образом:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
Существует один бит, который определяет, является ли число отрицательным или неотрицательным (ноль не является ни положительным, ни отрицательным, но имеет бит знака, установленный в ноль).Тогда есть восемь битов экспоненты и 23 битов мантиссы.Чтобы получить полезное число из этого, (приблизительно) выполняется следующий расчет:
M × 2 E
(это еще не все, но этого должно хватить для целей этого обсуждения)
Мантисса по сути не намного больше, чем 24-битное целое число.Это умножается на 2 до степени экспоненты, которая примерно равна числу от -128 до 127.
Таким образом, вы можете точно представить все числа, которые поместились бы в 24-разрядное целое число, кромечисловой диапазон также намного больше, так как большие показатели допускают большие значения.Например, максимальное значение для float
составляет около 3,4 × 10 38 , тогда как int
допускает значения только до 2,1 × 10 9 .
Ноэто также означает, что, поскольку 32 бита имеют только 4,2 × 10 9 различных состояний (которые все используются для представления значений, которые может хранить int
), что на большем конце числового диапазона float
числа расположены на большем расстоянии друг от друга (поскольку уникальных чисел float
не может быть больше, чем уникальных чисел int
).Тогда вы не можете точно представлять некоторые числа.Например, число 2 × 10 12 имеет представление в float
1,999,999,991,808.Это может быть близко к 2 000 000 000 000, но это не точно.Аналогично, добавление 1 к этому числу не меняет его, потому что 1 слишком мало, чтобы иметь значение для больших шкал, которые там используются float
.
Аналогично, вы также можете представлять очень маленькие числа (от 0 до1) в float
, но независимо от того, являются ли числа очень большими или очень маленькими, float
имеет точность только около 6 или 7 десятичных цифр.Если у вас большие числа, эти цифры находятся в начале номера (например, 4,51534 × 10 35 , что не более 451534, следует за 30 нулями - и float
не может сказать ничего полезного о том, являются ли эти 30цифры на самом деле являются нулями или чем-то еще), для очень маленьких чисел (например, 3.14159 × 10 -27 ) они находятся в дальнем конце числа, далеко за пределами начальных цифр 0,0000 ...