在浮子中铸造Int32 NAN

Cast an Int32 NAN in a float

本文关键字:Int32 NAN      更新时间:2023-10-16

我需要在不同的平台(有些是计算机,有些是电子板)之间通信32位浮点值以进行数据采集。在我的通信协议中,我希望使用NAN浮点来传达错误。问题是,有很多NAN,我想使用一个,特别是0x7FA00000。

所以,我想有一个标题,我在其中定义:

#define DAQ_SYSTEM_ERROR  (0x7FA00000)

问题是,这是一个有效的32位整数,并且正在执行:

float value = DAQ_SYSTEM_ERROR;

不会产生期望的结果。

有没有一种方法可以在没有太多代码的情况下点出这个?特别是,有没有一种方法可以使用reexplatecast指令来告诉编译器我想要的?我觉得这应该是可能的,但我做不到

代码必须使用C、C++、Objective-C和Swift。

编辑

感谢您的评论。我确实只对一个价值感兴趣。其想法是获取浮点值,然后对照NAN(定义为0x7FA00000)进行检查,以了解检索到的值是否是有效的测量值(并且应该记录),或者是否在某个地方发生了错误,在这种情况下,应该丢弃该值并升起标志。在"发送"平台上,某个浮动值受到0x7FA00000值的影响。在接收平台上,首先对字节进行解码,与0x7FA00000进行比较,然后如果一切顺利,则将其填充在浮点中。

在编译时无法指定要转换为浮点的确切位模式。((浮点)0x7FA00000)将变为2141192192.0。将特定位放入浮点值的唯一方法是在运行时通过指针:

float fval;
uint32_t fbits = 0x7FA00000;
. . .
memmove(&fval, &fbits, sizeof float);

大多数编译器也会接受:

*((uint32_t *)(& fval)) = fbits;

尽管memmove()更便于移植。