我有一种情况,需要在单个char中表示一个float。这个'minifloat‘需要表示的范围是0到10e-7,所以为了节省空间,我们总是可以假设这个数字是+ve,指数是-ve。
我考虑的表示是3位指数和5位尾数(带有1个隐含位),指数是以10为基数的,即x = man * 10^exp。
为了将浮点数转换为我的微型浮点数,我计划使用frexp,并使用一些数学方法将基数2转换为基数10。
这是一种明智的方法吗?或者有没有更好的方法来实现这一点?
发布于 2012-08-13 21:29:02
你真的需要值是浮点型的吗(也就是说,在值缩放时要有大致恒定的精度)?您将如何处理这些值?
一个更简单(也更有效)的想法是将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
}发布于 2012-08-13 21:25:10
如果它满足您的目的,则合理地使用这种格式作为存储或传输格式,即在较小的空间中记录数据。您应该验证此格式的舍入误差不会太大,以满足您的需求,范围是否合适等等。
这不是一个好的计算格式,因为它在正常的硬件上会很慢。
我不明白你会做什么基础转换。如果您在float中有一个IEEE-754浮点数,那么转换为8位格式或从8位格式转换为8位格式的工作就是在转换为较窄格式时对有效数(分数)进行舍入,以及调整指数偏差,以及处理特殊情况(反规格化、溢出、NaNs)。这将只涉及二进制算术,而不是十进制。
另外,请注意浮点数的小数部分的适当术语是“小数”或“有效数”( IEEE-754标准中使用的术语)。“尾数”是对数的小数部分。
发布于 2012-08-13 22:49:26
另一种方法是使用256个浮点数(或双精度)的静态数组,您可以根据自己的标准进行选择。
则转换无符号字符->浮点数/双精度数是微不足道的……
浮点/双精度->无符号字符的转换稍微复杂一些(在静态数组中查找最近的浮点数);与简单的二进制搜索算法进行比较需要大约8次比较,但根据您在静态数组中选择值的方式,您可能会发现更好。
当然,操作将使用本机float/double执行。
https://stackoverflow.com/questions/11935030
复制相似问题