c++ - 具有不同比例因子的定点数 4 字节或 8 字节 - 转换数字的库?

标签 c++ c bit-manipulation fixed-point

我必须读取 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 (short first, short second)
  {
float 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)));
}

这对我来说没问题,直到我的项目现在需要一个可变比例的位置。很好 - 但我只是好奇是否有更好的方法来做到这一点?必须有一个完整的库

这很快就变得复杂了,我很容易就会发现一些东西让我的代码无法工作 - 我也确信我没有做我应该做的那么多错误检查 - 非常好奇是否有一个库。

最佳答案

也许您需要使用“bignum”库。可能有点矫枉过正,但这里有一个例子:GMP

关于c++ - 具有不同比例因子的定点数 4 字节或 8 字节 - 转换数字的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901525/

相关文章:

C++ 编译器无法从迭代器派生出正确的类型

c - 根据函数 F( N ) = rank 计算十进制数的秩

c - 在 32 位无符号整数中查找位模式

c++ - 检查类是否派生自模板类

c++ - std::vector 插入是如何实现的? C++

c++ - Linux 注入(inject) C/C++ dll

c - argv 的编码是什么?

c - 哪个是最标准的 : strnlen or strnlen_s?

c - 乘以 5/8 并观察溢出

c++ - 这段代码有什么问题?