我有一种情况需要用单个 char
来表示 float
。这个 'minifloat' 需要表示的范围是 0 到 10e-7,所以我们总是可以假设数字是 +ve,指数 -ve 以节省空间。
我考虑过的表示形式是 3 位指数和 5 位尾数(隐含 1 位),指数以 10 为底,即 x = man * 10^exp
.
要将 float 转换为我的迷你 float ,我计划使用 frexp
,并使用一些数学运算将基数 2 转换为基数 10。
这是明智的做法吗?或者有更好的方法来实现这一目标吗?
最佳答案
您是否真的需要该值是 float (即随着值的缩放具有大致恒定的精度)?您将如何处理这些值?
一个更简单(也更有效)的想法是将 8 位解释为隐式标度为 1e-7 的无符号定点数。即:
float toFloat(uint8_t x) {
return x / 255.0e7;
}
uint8_t fromFloat(float x) {
if (x < 0) return 0;
if (x > 1e-7) return 255;
return 255.0e7 * x; // this truncates; add 0.5 to round instead
}
关于c++ - 用一个字节表示一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11935030/