Подтвердить что ты не робот

Почему float и int имеют такие разные максимальные значения, даже если они имеют одинаковое количество бит?

Возможный дубликат:
какая разница между типом данных float и integer, когда размер такой же в java?

Как вы, вероятно, знаете, оба эти типа являются 32-битными. int может содержать только целые числа, тогда как float также поддерживает с плавающей запятой (как указывают названия типов).

Как возможно тогда, что максимальное значение int равно 2 31 а максимальное значение float равно 3.4 * 10 38 тогда как оба из них 32 бит?

Я думаю, что емкость int max должна быть выше, чем float, потому что она не сохраняет память для плавающего числа и принимает только целые числа. В этом случае я буду рад объяснению.

4b9b3361

Ответ 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, поэтому это возможно. Пожалуйста, прочтите эту документацию. Речь идет не только о том, сколько бит.