Long Integer и Float - PullRequest
       22

Long Integer и Float

5 голосов
/ 28 января 2010

Если длинное целое и число с плавающей запятой занимают 4 байта для хранения в памяти, то почему их диапазоны отличаются?

Ответы [ 9 ]

12 голосов
/ 28 января 2010

Целые числа хранятся так:

  • 1 бит для знака (+/-)
  • 31 бит для значения.

Поплавки хранятся по-разному, давая больший диапазон за счет точности:

  • 1 бит для знака (+/-)
  • N бит для мантиссы S
  • M бит для показателя степени E

Число с плавающей запятой представлено в экспоненциальной форме: (+/-) S * (основание) ^ E

Кстати, "long" не всегда 32 бита. См. эту статью .

2 голосов
/ 28 января 2010

Другой способ кодирования ваших чисел.

Длинный счет от 1 до 2 ^ (4 * 8).

Float использует только 23 из 32 битов для «счета». Но это добавляет «диапазон» с показателем степени в других битах. Таким образом, у вас есть большие числа, но они менее точны (в нижних частях):

1,2424 * 10 ^ 54 (показатель степени мантиссы), безусловно, больше, чем 2 ^ 32. Но вы можете отличить длинные 2 ^ 31 от длинных 2 ^ 31-1, тогда как вы не можете различить значения с плавающей запятой 1.24 * 10 ^ 54 и числа с плавающей запятой 1.24 * 10 ^ 54 - 1: 1 просто теряется в этом представлении плавать.

1 голос
/ 28 января 2010

Они не всегда одинакового размера. Но даже когда они есть, их диапазоны различны, потому что они служат разным целям. Один для целых чисел без десятичных разрядов, а один для десятичных.

0 голосов
/ 28 января 2010

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

0 голосов
/ 28 января 2010

В общем: когда у вас больше диапазона значений (число с плавающей точкой до 10 ^ много), у вас меньше точность.

Вот что здесь происходит. Если вам нужны целые числа, 32-битная длина даст вам больше.

0 голосов
/ 28 января 2010

Их диапазоны различны, поскольку они используют разные способы представления чисел.

long (в с) эквивалентно long int.Размер этого типа варьируется между процессорами и компиляторами, но часто, как вы говорите, 32 бит.В 32 битах он может представлять 2 32 различных значений.Поскольку мы часто хотим использовать отрицательные числа, компьютеры обычно представляют целые числа в формате, называемом « two'splement ».Таким образом, мы можем представлять числа от (-2 31 ) и до (2 31 -1).Считая число 0, мы получим до 2 32 чисел.

float (в с) обычно представляет собой одиночное отформатированное число IEEE 754 .В 32 битах этот тип данных также может принимать 2 32 различных битовых комбинаций, но они не используются для непосредственного представления целых чисел, как в long.Вместо этого они представляют знак, а также богомол и показатель нормализованного десятичного числа.

0 голосов
/ 28 января 2010

Действительно, число с плавающей запятой занимает 4 байта (32 бита), но, поскольку это число с плавающей запятой, вы должны хранить разные вещи в этих 32 битах:

  • 1 бит используется для знака (+/-)
  • 8 бит используются для показателя степени
  • 23 бита используются для значащих и (значащих цифр)

Вы можете видеть, что диапазон значений с плавающей запятой напрямую зависит от количества битов, выделенных для значимого, а значения min / max зависят от количества битов, выделенных для показателя степени.

С верхним примером:

  • 8 бит для показателя степени (= размер символа) дает диапазон показателя [-128,127] -> максимум составляет около 127 * log10 (2) = 10 ^ 38

Что касается длинного целого, у вас есть 1 бит, используемый для знака, а затем 31 бит для представления целочисленного значения, приводящего к максимуму 2 147 483 647.

Вы можете взглянуть на Википедию для более точной информации: Википедия - Плавающая точка

0 голосов
/ 28 января 2010

Это можно объяснить с точки зрения того, почему представление с плавающей запятой может представлять больший диапазон чисел, чем представление с фиксированной запятой. Этот текст из записи Википедии :

Преимущество с плавающей точкой представление по фиксированной точке (и целое) представление, что это может поддерживать гораздо более широкий диапазон значений. Например, с фиксированной точкой представление, которое имеет семь десятичных цифры, с предполагаемой десятичной точкой позиционироваться после пятого цифра, может представлять числа 12345.67, 8765.43, 123.00 и т. Д., Тогда как с плавающей точкой представление (например, IEEE 754 десятичный32) с семью десятичными цифры могут дополнительно представлять 1,234567, 123456,7, 0,00001234567, 1234567000000000 и т. Д. Формат с плавающей запятой нуждается немного больше памяти (для кодирования позиции радиуса), поэтому при хранении в то же самое пространство, числа с плавающей точкой достичь их большего диапазона на за счет точности.

0 голосов
/ 28 января 2010

Нет, размер примитивных типов данных в Си определяется реализацией.

В этой вики-записи четко указано: The floating-point format needs slightly more storage (to encode the position of the radix point), so when stored in the same space, floating-point numbers achieve their greater range at the expense of precision.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...