C / C ++ - 将float转换为byte数组,以便字节保持排序

时间:2017-08-09 02:15:19

标签: c++ c floating-point

有没有办法将float转换为unsigned char fbytes[8],以便:

如果浮动值为f1 < f2,则fbytes1[i]的{​​{1}}不应大于fbytes2[i]的<{1}}?

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

2 个答案:

答案 0 :(得分:3)

如果你忽略NANs(它总是比较一切,包括它们自己),这很简单。否则,这是不可能的。

首先,直接转换为big-endian字节数组。

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

如果未设置符号位,请将其设置为使所有正数在所有负数后排序。

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

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

答案 1 :(得分:2)

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