Показать сообщение отдельно

  #7  
Старый 23.09.2007, 10:53
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от Joker-jar  
Кстати, ни в одном из калькуляторов не встречал перевод из Dec в Bin дробных чисел. Там алгоритм то простой...
Ну вообщем да.
Стандартом IEEE 754 описываются форматы представления вещественных чисел с плавающей запятой, известные в языке Си как float и double.
float занимает 32 бита, самый старший (31-й) бит - знаковый, дальше 8 бит экспонента (в смещенном виде по базе 127) и 23 бита мантиссы.
Число с плавающей запятой равно s*m*2^e, где s - знаковый бит, m - мантисса, e - экспонента.
В числе float экспонента хранится сложенной со 127 (так называемый смещенный вид). Чтобы получить реальную степень двойки, нужно вычесть 127 из значения экспоненты в числе.
Мантисса с логической точки зрения представляет собой число на промежутке [1;2), которое умножается на 2 в степени с показателем, равному экспоненте.
Представляется оно в виде числа с фиксированной запятой - один бит на целую часть и 23 бита на дробную. Поскольку целая часть всегда =1 в этом промежутке, то целая часть мантиссы в числе не хранится, все 23 бита занимает ее дробная часть.
Дробная часть представляет собой биты с отрицательными степенями двойки, например
10000000000000000000000 это 0.5, поскольку еденица в старшем бите представляет собой 2 ^ -1 = 1/2 = 0.5
01000000000000000000000 это 0.25, поскольку еденица в 21м разряде представляет собой 2 ^ -2 = 1/4 = 0.25
В этом нужно добавить еденицу (1.0) и получится значение мантиссы.

Например, число 0 10000000 10000000000000000000000:
знак = 0 (плюс)
экспонента = 10000000b - 127 = 128 - 127 = 1
мантисса:
1000000000000000000000 это 0.5
Соответственно мантисса равна 0.5 + 1.0 = 1.5

Число равно +1.5 *2^1 = 3.0

Формат double аналогичен лишь с той разницей, что там 1 бит знаковый, 11 бит экспонента и 52 бита мантисса (суммарно 8 байт)
 
Ответить с цитированием