我需要存储大约-10000到10000范围内的值。在范围边界处,所需的精度不是很高(可能大约64,我会看到它是如何拟合的),大约为零,精度需要是1或更好。
不幸的是,空间非常有限,不超过12位,甚至更好。严格来说,即使是half floats也是如此。是否有一个开源库,它处理一些非常短的浮点格式,短尾数和指数长度?像8位尾数和3位指数。
只需要从/到更大格式的转换,不进行算术运算。
答案 0 :(得分:4)
如果您没有进行任何计算,那么几乎不需要库。 frexp
,ldexp
以及一些有点蠢蠢欲动应该做的工作。
答案 1 :(得分:3)
答案 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
代码减半。