可以按 MSB 对 IEEE754 浮点进行排序吗?

问题描述 投票:0回答:1

我一直在做一些低级位操作,最终创建了一个算法,作为副产品,按重要性降序排列的八位字节(LE = 7 -> 0;BE = 0 -> 7)对 64 位浮点数进行排序。记录输出时,我期望任意顺序。然而,令我有些惊讶的是,它们被排序了(注意负数放在正数之后)!这是隐式排序随机浮点 (-50, 50) 的示例:

[
  4.2217695176666155,
  4.6478025698022165,
  25.500103628472857,
  26.819343028582594,
  43.402122471148246,
  44.150586938484324,
  -12.313937254813531,
  -21.429343402208257,
  -27.2049115791126,
  -38.48913575841195
]

我想知道这个输出在多大程度上是巧合或计算事实,因为依赖这些数据进行排序会很方便。我也认识到这听起来与基数排序非常相似,但正如之前提到的,我理解尾数相对于数字顺序是任意的。

编辑: 根据要求,这里是展示此行为的 TS 类,下面是我测试它的方式。

const ns = new NumberSet();

for (let i=0; i < 10; i++) {
    ns.add(100 * Math.random() - 50);
}

for (let n of ns) console.log(n);
algorithm sorting floating-point bit-manipulation radix-sort
1个回答
0
投票

您可以使用字典顺序“比较”浮点数,即将存储的位视为字符串或无符号整数,如果执行以下操作:

  1. 检查 NaN。如果是这样,则该程序不适用。中止! (一般来说,NaN 不与其他的比较,结果总是错误的。)
  2. 如果是负零,则将其视为正0(即翻转符号位)
  3. 如果为负数,则翻转所有位(包括符号位)
  4. 否则,仅翻转符号位(其他位保持不变)

上面假设您没有任何 NaN 值,因此是上面的步骤 1。如果是这种情况,并且应用上述转换,那么您可以将两个浮点数作为无符号整数值进行比较(或者按字典顺序,如果您愿意),结果将是原始浮点数的正确排序。

特别是,浮点指数存储有偏差的原因正是因为你可以做到这一点,即比较变得更容易。您正在做的事情本质上是利用了这种结构,因此在您的情况下输出的结果并不令人惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.