我的情况需要float
在单个char
中表示。这个'minifloat'需要表示的范围是0到10e-7,所以我们总是假设数字是+ ve,而指数-ve是为了节省空间。
我考虑过的表示是3位指数和5位尾数(带有1个隐含位),指数位于基数10,即x = man * 10^exp
。
要从float转换为我的minifloat,我打算使用frexp
,并使用一些数学从基数2转换为基数10.
这是一种明智的做法吗?或者有更好的方法来实现这一目标吗?
答案 0 :(得分:8)
您是否真的需要将值设置为浮点值(即,随着值的缩放而具有大致恒定的精度)?你打算怎么处理这些价值观?
更简单(也更有效)的想法是将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
}
答案 1 :(得分:4)
如果它符合您的目的,使用这种格式作为存储或传输格式是合理的,即用于在小空间中记录数据。您应该验证此格式的舍入误差是否不是太大,不适合您的需要,范围是合适的,等等。
这对于计算来说不是一个好的格式,因为它在普通硬件上会很慢。
我不明白你要做什么基础转换。如果在float
中有一个IEEE-754浮点数,则转换为8位格式或从8位格式转换的工作是在转换为较窄的格式时对有效数字(分数)进行舍入的工作。调整指数偏差,加上处理特殊情况(非正规,溢出,NaN)。这只涉及二进制算术,而不是十进制算法。
另外,请注意浮点数的小数部分的正确术语是“分数”或“有效数”(IEEE-754标准中使用的术语)。 “尾数”是对数的小数部分。
答案 2 :(得分:3)
另一种方法是使用256浮点数(或双数)的静态数组,您可以根据自己的标准选择它。
然后转换unsigned char - &gt;浮动/双重是微不足道的......
转换浮动/双重&gt; unsigned char有点复杂(在静态数组中找到最近的float);使用天真的二进制搜索算法会花费大约8次比较,但根据您在静态数组中选择值的方式,您可能会发现更好。
当然,操作将使用native float / double执行。
答案 3 :(得分:0)
5个尾数位为您提供从1.00到9.00的32种不同情况,最小步长为0.25
1.00 1.25 1.50 1.75 2.00 .... 8.75 9.00
3个指数可以给你8个不同的情况10 ^ 0(即1)10 ^ -2 10 ^ -3 10 ^ -4 ....最后10 ^ -7您的分数部分的错误是0.25。如果您的计算可以补偿此错误,那么您可以使用它。