Exception handling 当试图从非类型化缓冲区获取浮点值时,如何防止无效操作?

Exception handling 当试图从非类型化缓冲区获取浮点值时,如何防止无效操作?,exception-handling,floating-point,Exception Handling,Floating Point,考虑一个非类型化的缓冲区void*,我从中提取几个字节,将它们视为浮点值float或double。让我们假设浮点值在我的机器上与IEEE-754兼容。因此,缓冲区中可能存在不表示任何有效浮点值的二进制序列。试图对这样一个充满无效二进制的浮点变量进行操作将导致程序错误 在这种情况下,我如何防止程序中止?也就是说,我如何得知浮点变量中的无效二进制 p、 从非类型缓冲区提取浮点的正确方法是什么?我听说过联盟演员的把戏 void* buf; union U {int i; float f;};

考虑一个非类型化的缓冲区void*,我从中提取几个字节,将它们视为浮点值float或double。让我们假设浮点值在我的机器上与IEEE-754兼容。因此,缓冲区中可能存在不表示任何有效浮点值的二进制序列。试图对这样一个充满无效二进制的浮点变量进行操作将导致程序错误

在这种情况下,我如何防止程序中止?也就是说,我如何得知浮点变量中的无效二进制

p、 从非类型缓冲区提取浮点的正确方法是什么?我听说过联盟演员的把戏

void* buf;  
union U {int i; float f;};  
U *u = (U*) buf;  
u->i = binvalue;  
fpvalue = u->f;`

无效,即使buf正确对齐。

其中一个问题是,在许多系统上,浮点必须对齐,例如与4字节的倍数地址对齐,而完全任意的指针可能未对齐,指针甚至可能指向未映射的地址,例如,如果接近NULL

另一个问题是IEEE 754浮动确实定义了信令,而不是数字s等等。也许用isnan或isinf检查浮点值会有所帮助


最后,ieee754标准是如此复杂,以至于不是每个系统都能完全实现它。如果你想防止故障,你可能必须编写非常不可移植的代码。虽然我在过去读过该标准,但我也忘记了血淋淋的细节。

假设缓冲区正确对齐。我担心我甚至在调用isnan之前就已经让程序中止了,在这里我将二进制赋值给浮点变量。