繁体   English   中英

C++ 在不同平台/架构上浮动和加倍

[英]C++ floats and doubles on different platforms/architectures

对于上下文,我正在为 Arduino 开发一个库,以通过 LoRa 接收器传输数据包。

我遇到的问题是,库将来自浮点数和双精度数的原始位放入uint8_t数组,发送它们,然后将它们传输回浮点数和双精度数。

当编译器、平台和体系结构相同时,这当然有效,但是在解压缩它们并简单地将数据直接复制到其他平台(如 Windows 或 Linux 上的 C++)上的浮点数时,我会遇到问题吗?

我当然可以使用整数并有一些因素来保留小数位,但这增加了复杂性,我宁愿以某种方式解决。

如果您的实现使用 ieee754 浮点数,并且还有无符号的 32 位和 64 位整数,那么很可能在浮点数和 32 位整数之间以及双精度数和 64 位整数之间存在一一对应关系。 这完全适用于我在过去十年中使用的 100% 的实现。 (长双精度更可变)。

因此,您可以将浮点数移动到 32 位 unsigned int,通过将 x>>24、x>>16、x>>8 和 x 存储为任意固定顺序的字节,以某种固定顺序存储四个字节,然后将它们读回以相同的顺序。 与 64 位双精度相同。

或者,您可以像 JSON 一样将数字存储为文本。

如果您只是 memcpy floats 和 double,那么无论编译器如何,您都可以在同一平台上运行。

一旦您尝试使用 memcpy 结构或类,您将需要相同的编译器版本和设置。 这是一个巨大的蠕虫罐头。 只需检查此站点上有关填充的问题数量即可。 它会回来咬你的背面。

出于所有实际目的,现在就咬紧牙关,转换为整数或使用序列化工具包(json、protobuf 等)。 如果您担心性能,一旦您将序列化为整数或文本工作,请添加可选的 memcpy 模式,其中握手通过交换消息来验证兼容性,然后选择任一方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM