[英]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.