Преобразование числа смещений дробной части числа UNIX C

Создали следующую структуру для хранения больших чисел:

typedef enum {
  L_BITS, //младшие биты
  M_BITS, //средние
  H_BITS, //старшие
  S_BITS, //16-23 бит под экспаненту 31 под знак
  ALL_BITS
} e_dec_bit_t;

typedef struct {
  int bits[ALL_BITS];
} my_decimal;

#define INT_BITS sizeof(int) * 8
#define DEC_BITS ALL_BITS * sizeof(int) * 8

#define NEW_DECIMAL(l_b, m_b, h_b, scale, sign) \
  { l_b, m_b, h_b, ((scale << 16) | (sign << 31)) }

S_BITS

  • Биты от 0 до 15, младшее слово, не используются и должны быть равны нулю;
  • Биты с 16 по 23 должны содержать показатель степени от 0 до 28, который указывает степень 10 для разделения целого числа;
  • Биты с 24 по 30 не используются и должны быть равны нулю;
  • Бит 31 содержит знак;

Decimal число - это значение с плавающей точкой, состоящее из знака, числового значения, где каждая цифра находится в диапазоне от 0 до 9, и коэффициента масштабирования, который указывает положение десятичной точки, разделяющей целые и дробные части числового значения.

Двоичное представление Decimal состоит из 1-разрядного знака, 96-разрядного целого числа и коэффициента масштабирования, используемого для деления 96-разрядного целого числа и указания того, какая его часть является десятичной дробью. Коэффициент масштабирования неявно равен числу 10, возведенному в степень в диапазоне от 0 до 28. Следовательно, двоичное представление Decimal имеет вид ((от -2^96 до 2^96) / 10^(от 0 до 28)), где -(2^96-1) равно минимальному значению, а 2^96-1 равно максимальному значению.

Делю число 5 на 2 в итоге получаю 2.5 или в двоичной форме 10.01

Представление чисел Decimal


Вопрос в сдедующем в своей структуре я записываю порядок не в 2, а в 10 форме, как мне число смещений преобразовать в 10 форму, тоесть цифры от 0001 до 1001 в 10 форме имеют scale 1, в 2 от 1 до 4;

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

Смещение от точки записается в scale 16 - 23 bits в форме десятеричной и представляет смещение в форме 2^(1-4) откругляется до числа 1 в десятеричной форме которую я записываю 10^1


Мне необходимо найти число k --> 2^n = 10^k, где n известно.


Ответы (0 шт):