代码之家  ›  专栏  ›  技术社区  ›  Wasabi Thumbs

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

  •  1
  • Wasabi Thumbs  · 技术社区  · 1 年前

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

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

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

    Here 是展示这种行为的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);
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   alias    1 年前

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

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

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

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