【发布时间】:2021-09-11 23:35:38
【问题描述】:
对于上下文,我正在为 Arduino 开发一个库,以通过 LoRa 接收器传输数据包。
我遇到的问题是,库将浮点数和双精度数的原始位放入 uint8_t 数组中,发送它们,然后将它们传输回浮点数和双精度数。
这当然在编译器、平台和架构相同的情况下有效,但在解压它们并将数据直接复制到其他平台(如 Windows 或 Linux 上的 C++)上的浮点数时我会遇到问题吗?
我当然可以使用整数并有一些因素来保留小数位,但这增加了我宁愿以某种方式解决的复杂性。
【问题讨论】:
-
字节序是您需要担心的事情,所有具有硬件 FPU 的现代系统都使用 IEEE 754 binary32 浮点数和 binary64 双精度数。 en.wikipedia.org/wiki/Double-precision_floating-point_format
-
当有疑问时,格式化文本是最好的均衡器。这听起来既慢又愚蠢,但它确实有效,而且通常足够快。
-
让发送方将传出的浮点数从其本机格式转换为标准化格式,然后将该标准格式放入您的字节数组中。让接收器将接收到的标准格式字节中的传入浮点数转换为其本机格式。如果原生格式和传输格式恰好相同,那就这样吧,但不要依赖它,除非作为实现优化。整数、文本、任何多字节数据类型也是如此。不要以原始格式发送数据,将它们标准化。
-
如果您决定使用格式化文本,请考虑使用
"%a"printf格式。它生成十六进制输出并且不会丢失任何精度(假设浮点基数是 2 的幂,这几乎是肯定的)。 -
您可以简单地拥有一个由浮点的小数部分和浮点值的小数部分组成的两个整数值的结构,然后发送它而不是原始浮点值。这当然假设您的浮点值在整数范围内。然后发件人确切地知道他们得到了什么,并会相应地处理它。
标签: c++ floating-point cpu-architecture platform