Фиксированная точка номер 4 байта или 8 байтов с различными масштабными коэффициентами — библиотека для преобразования чисел?

Я должен прочитать числа с фиксированной запятой либо 4 байта, либо 8 байтов и местоположение десятичных ходов для каждого элемента (известное местоположение) (номер шкалы)

Есть ли библиотека, где это автоматизировано?

C / C ++ является языком выбора

Например:

Это предполагает масштаб 20

double toDoublePrecisionFixedPoint(short first,short second,short third,short forth)
{
double d = 0;

int top = (first << 0x10) | (second & 0x0000FFFF);
top/=8;
top >>= 8;
d+=top;

long long a = 0x0;
a = ((long long)second&0x07FF)<< 0x20;
long long t = 0x0;
t = (((long long)third) << 0x10) & 0xFFFF0000;
long long f = 0x0;
f = (((long long) forth)) & 0xFFFF;
long long bottom =  a | t | f;

long long maxflag= 0x80000000000;
double dlong = (double)bottom/(double)maxflag;
d += dlong;

return d;
}

это предполагает масштаб 15
float toSinglePrecisionFixedPoint (короткое первое, короткое второе)
{
плавать f;

    float dec = ((float)second) / ((float)0x10000);

f = (float)first;

if(f> 0 && dec >0)
f += dec;
else if(f >0 && dec <0)
f += (1 + dec);
else if(f < 0 && dec < 0)
f += dec;
else if(f < 0 && dec >0)
f -= (1 - dec);
else if(f == 0)
f += dec;return f;
}void floatToShorts(float f,short*ret)
{
ret[0] = 0x00;
ret[1] = 0x00;
ret[0] = (short)f;
double decimal = 0;//THIS IS REMOVING THE WHOLE NUMBER
modf(f , &decimal);
ret[1] = (short)(decimal * 0x10000);
}

void doubleToShorts(double d,short*ret)
{
ret[0] = 0x00;
ret[1] = 0x00;
ret[2] = 0x00;
ret[3] = 0x00;

d*=0x80000000000;
long long l = (long long)d;

ret[0] = ((short)((l & 0xFFFF000000000000) >> 48));
ret[1] = ((short)((l & 0x0000FFFF00000000) >> 32));
ret[2] = ((short)((l & 0x00000000FFFF0000) >> 16));
ret[3] = ((short)((l & 0x000000000000FFFF)));
}

у меня все получалось, пока мой проект не нуждается в переменном масштабе. Это нормально, но мне просто интересно, есть ли лучший способ сделать это? Там должна быть полная библиотека

это быстро усложняется, и я могу легко что-то сделать, чтобы мой код не работал — я также уверен, что я не делаю столько ошибок, сколько мне нужно — так любопытно, если есть библиотека.

-2

Решение

Возможно, вам нужно использовать библиотеку ‘bignum’. Может быть излишним, но вот один пример: GMP

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]