寻找半浮动或四分之一浮动库

时间:2012-03-15 13:37:37

标签: c++ c assembly floating-point

我需要存储大约-10000到10000范围内的值。在范围边界处,所需的精度不是很高(可能大约64,我会看到它是如何拟合的),大约为零,精度需要是1或更好。

不幸的是,空间非常有限,不超过12位,甚至更好。严格来说,即使是half floats也是如此。是否有一个开源库,它处理一些非常短的浮点格式,短尾数和指数长度?像8位尾数和3位指数。

只需要从/到更大格式的转换,不进行算术运算。

4 个答案:

答案 0 :(得分:4)

如果您没有进行任何计算,那么几乎不需要库。 frexpldexp以及一些有点蠢蠢欲动应该做的工作。

答案 1 :(得分:3)

或许μ-lawA-law可能对您有用。

答案 2 :(得分:2)

我们使用openexr附带的libHalf。我不是它的忠实粉丝,因为代码质量并不是很好(尽管它也没有严重破坏)。在提取的源中查找名为Half的目录 - 它应该是独立的。

答案 3 :(得分:1)

根据JensBjörnhager的回答推断,我得到了这个:

double from_storage(unsigned short bits) { //only lowest 10 bits read
        double a = bits&0x1FF;
        a /= 5.11967985;
        a = a*a;
        return double(bits&0x200 ? -a : a);
}

unsigned short to_storage(double a) { //only lowest 10 bits set/relevant
        assert(a<=10000.0);
        assert(a>=-10000.0);
        if (a >= 0) {
                a = std::pow(a, .5); // inverse of number in from_storage
                a *= 5.11967985;
                unsigned short b = ((unsigned short)(a));
                assert((b&0x200)==0);
                return b;
        } else {
                a = std::pow(-a, .5);
                a *= 5.11967985;
                unsigned short b = ((unsigned short)(a));
                assert((b&0x200)==0);
                return b | 0x200;
        }
}

http://ideone.com/DLTUn所示。这可以唯一地保持介于-10和10之间的每个值,并且顶部值仅相隔39。 (在0和1之间还有3个值)。更多的人可能会得到正面和负面的更多“二恭维”格式,这会将to_storage代码减半。