Целочисленное представление для представления с плавающей точкой - PullRequest
0 голосов
/ 18 февраля 2012

Существует ли алгоритм, который может преобразовывать 32-разрядное целое число в его целочисленном представлении в представление с плавающей запятой IEEE 754, просто используя целочисленные операции?


У меня есть пара мыслей по этому поводу, но пока ни одна из этих работ не работает. (С использованием C)

  1. Я думал о сдвиге целых чисел, но потом мне не удалось построить новое представление с плавающей точкой на этом.

  2. Полагаю, я мог бы преобразовать целое число в двоичное, но оно имеет то же самое проблема с первым подходом.

1 Ответ

2 голосов
/ 18 февраля 2012

отличный ресурс на поплавке

Address   +3        +2      +1      +0
Format SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

S представляет бит знака, где 1 отрицательно, а 0 положительно.

E - показатель степени дополнения к двум со смещением 127.

M - 23-битная нормализованная мантисса. Старший бит всегда равен 1 и, следовательно, не сохраняется

Тогда посмотрите здесь для дополнения до двух


Я буду использовать num в качестве массива битов, я знаю, что это не стандартный доступ к диапазону массива C, но вы получаете точку
Итак, для базового алгоритма мы начнем с заполнения S.

bit S = 0;
if (num[0] ==1) {
  S = 1;
  num[1..32] = -num[1..32] + 1; //ignore the leading bit. flip all the bits then add 1
}

Теперь мы установили S и у нас есть скалярное значение для оставшейся части числа.

Тогда мы можем расположить наш номер в мантиссе, найдя первый индекс 1. Это также позволит нам найти показатель степени. Обратите внимание, что показатель всегда будет положительным, поскольку у нас не может быть дробных значений int. (также сделайте специальный случай для проверки, если сначала значение равно 0, чтобы избежать здесь бесконечного цикла, или просто измените цикл соответствующим образом, я ленивый)

int pos = 1;
signed byte E = 32;
bit[23] M;
while(num[pos] == 0) {
  --E;
  ++pos;
}
int finalPos = min(32, pos+23); //don't get too many bits
M = num[pos+1..finalPos]; //set the mantissa bits

Затем вы строите свой поплавок с битами в S, E, M

...