表示单个字节中的浮点数
Representing a float in a single byte
我有一个情况,需要用一个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 次,但根据您选择静态数组中值的方式,您可能会发现更好。
当然,操作将使用本机浮点数/双精度值执行。
尾数位为您提供从 1.00 到 9.00 的 32 种不同情况,最小步长为 0.25
1.001.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。如果您的计算可以补偿此错误,则可以使用它。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- C++浮点数和字节数组的联合问题
- 使用 Python 导出 4 个字节浮点数
- C/C++ - 将浮点数转换为字节数组,以便字节保持排序
- 将字节向量转换为浮点数向量
- 将浮点数划分为单个字节
- 表示单个字节中的浮点数
- 浮点数组是否始终与16字节边界对齐
- 交换浮点数组中的字节
- 如何使用zmq/zeromq从传递给python的字符串表示(字节数组)中获取整数/浮点数
- 我试图访问浮点数中的单个字节,我得到了意想不到的结果
- 为什么没有2字节浮点数,实现是否已经存在?