如果有一个8字节的数据段并向其写入一个双精度浮点值,在什么条件下通过数值比较和字节的字典排序进行比较会一致?
我相信如果数字是正数,并且表示是big-endian,那么浮点值的数字排序将与字节的字典排序相匹配。
这个想法是,它首先对指数进行排序,然后对尾数进行排序。即使是“非规范化”的IEEE表示也不应该引起任何问题。
这是真的吗?
(我正在使用Node的Buffer::write eDoubleBE,但这不重要。)
我认为一个简单的修改可以将其扩展到负数:XOR所有带有0x8000…
的正数和带有0xffff…
的负数。这应该翻转两个上的符号位(所以负数先走),然后反转负数的顺序。有人认为这有问题吗?
你的做法:
我认为一个简单的修改可以将其扩展到负数:XOR所有0x8000的正数…和0xffff的负数….这应该翻转两个符号位(所以负数先走),然后反转负数的顺序。有人认为这有问题吗?
是绝对的答案。此外,它被用于,例如,在dBase和克隆中,用于组织对浮点列的排序,我想它之后是更新的DB代。
此外,对于二进制表示,它与IEEE-754中的“总顺序”相同。(但对于十进制不是,后者要复杂得多。)
更新:正如@Sneftel所建议的:在转换为位字符串之前,您可以发现将-0替换为0很有用。
如果你想让基数排序保持稳定的排序算法,你必须再次交换负数部分中相等元素的所有子部分,因为当你交换负数时,原来的稳定排序是稳定的。
奥斯陆大学阿恩·莫斯副教授