Как преобразовать десятичное число в формат с плавающей точкой одинарной точности IEEE 754? - PullRequest
20 голосов
/ 08 марта 2010

Как мне перейти к ручному изменению десятичного числа (основание 10) на формат с плавающей точкой одинарной точности IEEE 754? Я понимаю, что в этом есть три части: знак, показатель степени и мантисса. Я просто не совсем понимаю, что на самом деле представляют две последние части.

Ответы [ 3 ]

26 голосов
/ 09 марта 2010

Найдите наибольшую степень 2, которая меньше вашего числа, например, если вы начинаете с x = 10,0, то 2 3 = 8, так что показатель степени равен 3. Показатель смещен на 127, поэтому означает, что показатель степени будет представлен как 127 + 3 = 130. Тогда мантисса будет 10,0 / 8 = 1,25. 1 является неявным, поэтому нам просто нужно представить 0,25, что составляет 010 0000 0000 0000 0000 0000, когда выражено как 23-битное дробное число без знака. Знаковый бит равен 0 для положительного. Итак имеем:

s | exp [130]  | mantissa [(1).25]            |

0 | 100 0001 0 | 010 0000 0000 0000 0000 0000 |

0x41200000

Вы можете проверить представление с помощью простой программы на C, например,

#include <stdio.h>

typedef union
{
    int i;
    float f;
} U;

int main(void)
{
    U u;

    u.f = 10.0;

    printf("%g = %#x\n", u.f, u.i);

    return 0;
}
11 голосов
/ 29 сентября 2013

Возьмите число 172.625. Это число в формате Base10.

Преобразовать этот формат в формат base2 Для этого сначала преобразуйте 172 в двоичный формат

128 64 32 16 8 4 2 1
 1  0  1  0  1 1 0 0
172=10101100

Конвертировать 0,625 в двоичный формат

0.625*2=1.250   1
0.250*2=.50     0
0.50*2=1.0      1
0.625=101

Двоичный формат 172,625 = 10101100,101. Это в формате base2 10101100 * 2

Сдвиг этого двоичного числа

1.0101100*2 **7      Normalized
1.0101100 is mantissa
2 **7 is exponent

добавить показатель 127 7 + 127 = 134

конвертировать 134 в двоичный формат

134=10000110

Число положительное, поэтому знак числа 0

0 |10000110 |01011001010000000000000

Пояснение: Старший бит - это знак числа. число сохраняется в формате величины знака. Экспонента хранится в 8-битном формате поля с смещением 127 на экспоненту. Цифра справа от двоичной точки хранится в младшем 23-битном порядке. ПРИМЕЧАНИЕ --- Этот формат является 32-битным форматом IEEE с плавающей запятой

8 голосов
/ 09 марта 2010

Число с плавающей запятой - это просто научная запись . Допустим, я попросил вас выразить окружность Земли в метрах , используя научную запись. Вы бы написали:

4,007516 & раз; 10 7 м

Показатель - это всего лишь сила десяти здесь. Мантисса - это действительные цифры номера. И знак, конечно, просто положительный или отрицательный. Таким образом, в этом случае показатель степени равен 7, а мантисса равна 4,007516.

Единственное существенное различие между IEEE754 и научной нотацией начальной школы состоит в том, что числа с плавающей запятой находятся в base 2 , так что это не раз десять в силу чего-то, это два раза в силу чего-либо , Итак, где бы вы написали, скажем, 256 в обычной человеческой научной нотации как:

2,56 & times; 10 2 (мантисса 2,56 и показатель степени 2),

в IEEE754, это

1 & times; 2 8 & mdash; мантисса равна 1, а показатель степени равен 8.

...