Биты точности поплавка - PullRequest
1 голос
/ 10 июня 2011

В этой вики статье показано 23 бита для точности, 8 для показателя степени и 1 для знака

Где находится скрытый 24-й бит в типе с плавающей запятой, который составляет (23 + 1) для 7 значащих и цифр?

Ответы [ 3 ]

5 голосов
/ 10 июня 2011

Числа с плавающей точкой обычно нормализуются. Возьмем, к примеру, научную нотацию, так как большинство из нас изучали ее в школе. Вы всегда масштабируете показатель степени, поэтому перед десятичной запятой стоит ровно одна цифра. Например, вместо 123.456 вы пишете 1,23456x10 2 .

Плавающая точка на компьютере обычно обрабатывается (почти 1 ) одинаково: числа нормализуются, поэтому перед двоичной точкой стоит ровно одна цифра (двоичная точка, поскольку большинство работает в двоичном, а не в десятичном виде). Однако есть одно различие: в случае двоичного числа это означает, что цифра перед десятичной точкой должна быть 1. Поскольку это всегда 1, нет необходимости хранить этот бит. Чтобы сохранить немного памяти в каждом числе с плавающей запятой, этот бит 1 является неявным, а не сохраняется.

Как обычно, ситуация немного шире, чем эта. Основное отличие состоит в денормализованных числах. Рассмотрим, например, если вы делали научные записи, но вы могли использовать только экспоненты от -99 до +99. Если вы хотите сохранить число, например, 1,234 * 10 -102 , вы не сможете сделать это напрямую, поэтому, вероятно, оно будет округлено до 0.

Денормализованные числа дают вам возможность справиться с этим. Используя денормализованный номер, вы сохраните его как 0,001234 * 10 -99 . Предполагая (как это обычно бывает на компьютере), что число цифр для мантиссы и экспоненты ограничено, это теряет некоторую точность, но все же позволяет избежать потери всей точности и просто вызвать ее 0.


1 Технически, есть различия, но они не имеют никакого значения для базового понимания.

2 голосов
/ 11 июня 2011

Когда вы пишете, формат с плавающей запятой одинарной точности имеет знаковый бит, восемь битов экспоненты и 23 значащих бита.Пусть s будет знаковым битом, e будет экспонентным битом, а f будет значимым битом.Вот что означают различные комбинации битов:

Если e и f равны нулю, объект равен +0 или -0, в зависимости от того, s равен 0 или 1.

Если eноль и f нет, объект (-1) с * 2 1-127 * 0.f.«0.f» означает запись 0, точки и 23 битов f, затем интерпретируют это как двоичное число.Например, 0,011000 ... это 3/8.Это «субнормальные» числа.

Если 0 s * 2 e-127 * 1.f,«1.f» аналогичен «0.f» выше, за исключением того, что вы начинаете с 1 вместо 0. Это неявный бит.Большинство чисел с плавающей точкой в ​​этом формате;это «нормальные» числа.

Если e равно 255, а f равно нулю, объект равен + бесконечности или -infinity, в зависимости от того, равен s 0 или 1.

Если e255 и f не ноль, объект является NaN (не число).Значение поля f NaN зависит от реализации;это не полностью определено стандартом.Обычно, если первый бит равен нулю, это сигнал NaN;в противном случае это тихий NaN.

2 голосов
/ 10 июня 2011

http://en.wikipedia.org/wiki/Single_precision_floating-point_format#IEEE_754_single_precision_binary_floating-point_format:_binary32

Истинное значение содержит 23 дробных бита справа от двоичной точки и неявный начальный бит (слева от двоичной точки) со значением 1, если показатель степени не равенхранится со всеми нулями

Объясняет это довольно хорошо, это условно / дизайн, что последний бит не хранится явно, а скорее указано в спецификации, что он есть, если все не равно 0 '.

...