Почему float и int имеют такие разные максимальные значения, даже если они имеют одинаковое количество бит?
Возможный дубликат:
какая разница между типом данных float и integer, когда размер такой же в java?
Как вы, вероятно, знаете, оба эти типа являются 32-битными. int
может содержать только целые числа, тогда как float
также поддерживает с плавающей запятой (как указывают названия типов).
Как возможно тогда, что максимальное значение int
равно 2 31 а максимальное значение float
равно 3.4 * 10 38 тогда как оба из них 32 бит?
Я думаю, что емкость int
max должна быть выше, чем float, потому что она не сохраняет память для плавающего числа и принимает только целые числа. В этом случае я буду рад объяснению.
Ответы
Ответ 1
Ваша интуиция совершенно справедливо сообщает вам, что в ней не может быть более информационного контента, потому что у них обоих 32 бита. Но это не означает, что мы не можем использовать эти биты для представления разных значений.
Предположим, я изобрел два новых типа данных uint4
и foo4
. uint4
использует 4 бита для представления целого числа в стандартном двоичном представлении, поэтому мы имеем
bits value
0000 0
0001 1
0010 2
...
1111 15
Но foo4
использует 4 бита для представления этих значений:
bits value
0000 0
0001 42
0010 -97
0011 1
...
1110 pi
1111 e
Теперь foo4
имеет диапазон значений более широкий, чем uint4
, несмотря на то же количество бит! Как? Поскольку существуют значения uint4
, которые не могут быть представлены foo4
, поэтому эти "слоты" в битовом отображении доступны для других значений.
То же самое для int
и float
- они могут хранить значения из набора значений 2 32 только разные наборы значений 2 32.
Ответ 2
Поплавок может хранить большее числовое значение, но он не будет точным даже на цифрах до десятичной точки.
Рассмотрим следующий пример:
float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a); // 1.234568E+29
Обратите внимание на то, что практически не сохраняется точность.
Целое число, с другой стороны, всегда будет точно хранить любое число в пределах диапазона значений.
Для сравнения давайте посмотрим на число с плавающей запятой двойной точности:
double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
Обратите внимание, что примерно в два раза больше значимых цифр сохраняется.
Ответ 3
Подсказка находится в "плавающей" части "с плавающей запятой". То, что вы говорите, в основном предполагает фиксированную точку. Число с плавающей запятой не является "зарезервированным пространством" для цифр после десятичной точки - оно имеет ограниченное количество цифр (23 двоичных файла) и запоминает, какую силу два умножить на.
Ответ 4
Они основаны на спецификации с плавающей точкой IEEE754, поэтому это возможно. Пожалуйста, прочтите эту документацию. Речь идет не только о том, сколько бит.