Фиксированная точка против числа с плавающей точкой


109

Я просто не могу понять числа с фиксированной и плавающей запятой из-за того, что их трудно читать по всему Google. Но ни один из тех, что я прочитал, не дает достаточно простого объяснения того, чем они являются на самом деле. Могу я получить простое определение на примере?


Мне также трудно найти хорошее определение. Главное, что я ищу, - это что-то, что поможет мне понять эти результаты: 3,11 + 42,0 = 45,110001 (не 45,11), 3,12 + 42,0 = 45,119999 (не 45,12), 3,15 + 42,0 = 45,150002 (не 45,15).
Барт С.

1
Я думаю, что это уместное обсуждение (особенно описание ловушек с плавающими числами и более высокая точность с фиксированной точкой и почему вы никогда не захотите описывать деньги как плавающие. Stackoverflow.com/questions/6320209/…
Эндрю Норман

Случайная ссылка, где упоминаются темы «OpenGL® ES OpenGL ES включает профили для систем с плавающей и фиксированной точкой и спецификацию EGL ™ ...»
The Red Pea

Ответы:


145

Число с фиксированной запятой имеет определенное количество бит (или цифр), зарезервированных для целой части (часть слева от десятичной точки), и определенное количество битов, зарезервированных для дробной части (часть справа от десятичной точки). точка). Независимо от того, насколько велико или мало ваше число, оно всегда будет использовать одинаковое количество бит для каждой части. Например, если ваш формат с фиксированной запятой был десятичным, IIIII.FFFFFто наибольшее число, которое вы могли бы представить, было бы, 99999.99999а наименьшее ненулевое число было бы00000.00001 . Каждый бит кода, обрабатывающий такие числа, должен иметь встроенную информацию о том, где находится десятичная точка.

Число с плавающей запятой не резервирует определенное количество бит для целой или дробной части. Вместо этого он сохраняет определенное количество бит для числа ( так называемой мантиссой или мантиссой ) и определенное количество бит , чтобы сказать , где в пределах этого числа десятичного место сидит ( так называемое показателем ). Таким образом, число с плавающей запятой, которое занимает 10 цифр с 2 цифрами, зарезервированными для экспоненты, может представлять наибольшее значение 9.9999999e+50и наименьшее ненулевое значение 0.0000001e-49.


8
Ну, вы забываете, что числа с плавающей запятой почти всегда подписаны, поэтому минимальное значение действительно будет -9.9999999e+50.
Брайан Гордон

4
Также существует смещение экспоненты, так что вы можете представить гораздо больше дискретных значений от 0 до 1, чем от 1 000 000 до 1 000 001. И есть много сложностей с операциями с плавающей запятой, которые возникают, например, если вы не указываете 0 как разницу между двумя очень похожими числами, когда смещения недостаточно для повышения точности.
Брайан Гордон

28
@BrianGordon: Я не забыл о знаках; Я намеренно проигнорировал их, чтобы иметь простое описание и не беспокоиться о разнице между минимальным / максимальным и минимальным / максимальным. Я также намеренно исключил смещение экспоненты (которое не имеет ничего общего с количеством дискретных значений между любыми двумя числами), NaN, бесконечности, нормализация, постепенное истощение, нули со знаком, тот факт, что большинство чисел с плавающей запятой являются двоичными (что позволяет использовать первый бит мантиссы, которую следует опустить) и ряд других аспектов, которые не являются необходимыми для иллюстрации концепции.
Гейб

2
Почему отсечка для минимального количества фиксированных точек 00000.00001? Я ожидаю увидеть 00000.00000вместо этого. Кроме того, есть ли у вас какие-либо ссылки, в которых подробно рассказывается о числах с фиксированной точкой?
Николас Миллер

4
@NickMiller: Извините за путаницу, но я говорил о ненулевых числах. Формат моего примера может представлять 0, 0.00001, 0.00002, ..., 99999.99998, 99999.99999.
Гейб

31

Число с фиксированной точкой просто означает, что после десятичной точки стоит фиксированное количество цифр. Число с плавающей запятой позволяет использовать различное количество цифр после десятичной запятой.

Например, если у вас есть способ хранения чисел, для которого требуется ровно четыре цифры после десятичной точки, то это фиксированная точка. Без этого ограничения это плавающая точка.

Часто, когда используется фиксированная точка, программист фактически использует целое число, а затем делает предположение, что некоторые цифры выходят за пределы десятичной точки. Например, мне может понадобиться сохранить две цифры точности, поэтому значение 100 означает фактически 1,00, 101 означает 1,01, 12345 означает 123,45 и т. Д.

Числа с плавающей запятой являются более универсальными, поскольку они могут одинаково представлять очень маленькие или очень большие числа, но есть небольшой штраф, связанный с необходимостью иметь дополнительное хранилище для места десятичной точки.


2
использование чисел с плавающей запятой становится проблемой, когда вы начинаете выполнять с ними вычисления, например, если вы складываете вместе очень маленькое и очень большое число с плавающей запятой. Суммированный результат теряет точность, так как он должен представлять число с двумя крайними значениями, а нижние десятичные дроби обрезаются (и не округляются).
Эндрю Норман

2
также потенциальное использование значений экспоненты в числах с плавающей запятой может вызвать проблемы с компьютерными системами, ожидающими стандартных чисел
Эндрю Норман

5

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

Например, если число 12.34необходимо сохранить, и нам нужны только две цифры точности после десятичной точки, число умножается на, 100чтобы получить 1234. При вычислении этого числа мы будем использовать этот набор правил. Добавление 5620или 56.20к этому числу даст 6854данные или 68.54.

Если мы хотим вычислить десятичную часть числа с фиксированной точкой, мы используем операнд по модулю (%).

12.34 (псевдокод):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Числа с плавающей запятой - это совсем другая история в программировании. Текущий стандарт для чисел с плавающей запятой использует что-то вроде 23 бита для данных числа, 8 бит для показателя степени и 1, но для знака. См. Эту ссылку в Википедии для получения дополнительной информации об этом.


3

Термин «фиксированная точка» относится к соответствующему способу представления чисел с фиксированным количеством цифр после, а иногда и перед десятичной точкой. При представлении с плавающей запятой размещение десятичной запятой может «плавать» относительно значащих цифр числа. Например, представление с фиксированной точкой с единым соглашением о размещении десятичной точки может представлять числа 123,45, 1234,56, 12345,67 и т. Д., Тогда как представление с плавающей запятой может дополнительно представлять 1,234567, 123456.7, 0,00001234567, 1234567000000000 и т. Д.


-6

Возьмите номер 123.456789

  • В качестве целого числа это число будет 123.
  • В качестве фиксированной точки (2) это число будет 123,46 (при условии, что вы округлили его в большую сторону).
  • В качестве числа с плавающей запятой это число будет 123,456789.

Плавающая точка позволяет вам представить почти каждое число с большой точностью. Исправлено менее точно, но проще для компьютера.


11
Точность, с которой вы можете написать число, не зависит от того, записано ли оно с плавающей запятой, целым или фиксированной запятой. Это связано с количеством имеющихся у вас значащих цифр. Например, INT_MAX - это число, которое может быть точно представлено как int, но не как число с плавающей точкой, потому что у них нет 31 бита точности, необходимой для его точного представления.
Киан

1
fixed является наиболее точным, если его размер соответствует рассматриваемому числу. Когда вы выполняете математику с числами с фиксированной запятой, округление происходит, когда в вычислении остаток превышает десятичный предел. С плавающей запятой вы можете получить очень неточное значение, если сложите очень маленькое число с очень большим. Когда это происходит, цифры теряются без округления
Эндрю Норман

Это заблуждение и неверно. Фиксированная точка означает, что количество цифр после десятичной точки фиксировано. Он ничего не говорит о том, насколько он точен.
Оскар Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.