表示单个字节中的浮点数

Representing a float in a single byte

本文关键字:浮点数 字节 单个 表示      更新时间:2023-10-16

我有一个情况,需要用一个char来表示float。这个"迷你浮点数"需要表示的范围是 0 到 10e-7,因此我们始终可以假设数字是 +ve,指数是 -ve,以节省空间。

我考虑过的表示是 3 位指数和 5 位尾数(带有 1 个隐含位),指数以 10 为底,即 x = man * 10^exp .

要从浮点数

转换为我的迷你浮点数,我计划使用 frexp ,并使用一些数学方法从基数 2 转换为基数 10。

这是一个明智的方法吗?还是有更好的方法来实现这一目标?

你真的需要值是浮点数吗(即随着值的缩放,精度大致恒定)? 你打算用这些价值观做什么?

一个更简单(也更有效)的想法是将 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
}

如果符合您的目的,使用存储或传输格式这样的格式是合理的,即用于在狭小的空间内记录数据。您应该验证此格式的舍入误差对于您的需求来说不是太大,范围是否合适,等等。

这不是一个好的计算格式,因为它在普通硬件上会很慢。

我不明白你会做什么基础转换。如果您在 float 中有一个 IEEE-754 浮点数,那么转换为 8 位格式或从 8 位格式转换的工作是在转到较窄格式时对有效数(分数)进行舍入并调整指数偏差,以及处理特殊情况(非正规、溢出、NaN)。这将只涉及二进制算术,而不是十进制。

顺便说一句,请注意,浮点数分数部分的正确术语是"分数"或"有效"(IEEE-754标准中使用的术语)。"尾数"是对数的小数部分。

另一种方法是使用一个 256 个浮点数(或双精度)的静态数组,您将根据自己的标准选择该数组。

那么转换无符号字符 ->浮点/双精度是微不足道的......

转换浮点数/双>无符号字符有点复杂(在静态数组中找到最近的浮点数);使用朴素的二叉搜索算法进行大约 8 次比较需要花费大约 8 次,但根据您选择静态数组中值的方式,您可能会发现更好。

当然,操作将使用本机浮点数/双精度值执行。

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。如果您的计算可以补偿此错误,则可以使用它。