Преобразование числа смещений дробной части числа 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
Вопрос в сдедующем в своей структуре я записываю порядок не в 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 известно.
