繁体   English   中英

C / C ++-将浮点数转换为字节数组,以便字节保留顺序

[英]C/C++ - converting a float to byte array such that bytes preserve ordering

有没有一种方法可以将float转换为unsigned char fbytes[8] ,使得:

如果浮点值f1 < f2 ,则对于0 <= i <= 7 ?, fbytes1[i]绝不应该大于fbytes2[i]

其背后的目的是序列化并存储浮点数,并且仍然能够通过逐字节比较来进行比较。 例如,即使浮点数存储为原始字节,我也可以通过简单的字节比较对行进行排序,并且仍然保留顺序。

如果您忽略NAN(NAN总是比较不等于所有事物,包括它们自己),这很简单。 否则,这是不可能的。

首先,直接转换为大端字节数组。

符号位是第一个字节的高位。 接下来的几位是指数,然后是尾数。

如果未设置符号位,请对其进行设置,以使所有正数排在所有负数之后。

否则,将~运算符应用于所有字节(或者在将其全部打包为单个整数时执行此操作-为什么仍然需要字节?)。 这将颠倒负数内的排序顺序,并将它们移到正数之下。

您可能还希望合并零(如果在任何地方设置的唯一位是符号位,请将其清除)。

如果您的浮点实现使用IEEE-754(大多数情况下),则可以利用一个微妙的设计点:如果将IEEE浮点值的位视为整数值的符号幅度表示,通常该值的排序比较将与浮点值的相应比较提供完全相同的顺序, 在存在NaN时提供一致的排序(正NaN大于无穷大,负NaN小于-无穷大)。 因此,请检查符号位:如果它们不同,则正号较大;否则,正号较大。 如果它们相同,则将其余部分视为整数值进行比较。

暂无
暂无

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

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