【问题标题】:How can I convert IBM floating point to JavaScript numbers?如何将 IBM 浮点数转换为 JavaScript 数字?
【发布时间】:2014-09-25 15:43:35
【问题描述】:

我想从旧文件格式中读取数据。该格式使用IBM floating point 数字,我想在JavaScript 程序中读取它。 IBM System/360 上使用了 IBM 浮点表示。

如何将 IBM 浮点数转换为 JavaScript 数字?

【问题讨论】:

  • 我不知道 IBM 有自己的浮点系统。你指的是this吗?
  • IBM 在过去有自己的浮点表示。在 IEEE 帮助大家就当今最常用的表示达成一致之前。
  • 也许这有点用处(不是在 Javascript 中,但仍然):stackoverflow.com/questions/6399486/…
  • 与其专门考虑 Javascript 数字,不如寻找将 IBM 专有转换为 IEEE 754 二进制浮点的任何内容,包括问题@NPE 链接。

标签: javascript floating-point


【解决方案1】:

这个函数接受一个小端IBM浮点数的缓冲区并将它们转换为一个数字:

function ibm2js(buffer) {
    var sign = buffer[0] >> 7
    var exponent = buffer[0] & 0x7f
    var fraction = 0
    function bit(buffer, bit) {
        return buffer[Math.floor(bit / 8)] >> (7 - (bit % 8)) & 1
    }
    for (var i = 0; i < 24; i++) {
        fraction += bit(buffer, 8 + i) / (2 << i)
    }
    return (1 - 2 * sign) * Math.pow(16.0, exponent - 64) * fraction
}

请注意,不包括 NaN、Infinity 等特殊情况。

这是移植自:http://objectmix.com/perl/21834-ibm-32-bit-floating-point-conversion.html

【讨论】:

    【解决方案2】:

    对 Hallgrim 解决方案的小幅更新,允许处理双精度浮点数:

    function ibm2js(buffer) {
        var sign = buffer[0] >> 7
        var exponent = buffer[0] & 0x7f
        var fraction = 0
        function bit(buffer, bit) {
            return buffer[Math.floor(bit / 8)] >> (7 - (bit % 8)) & 1
        }
        var denom = 1
        var totalBit = (buffer.length - 1) * 8
        for (var i = 0; i < totalBit; i++) {
            denom = denom * 2
            fraction += bit(buffer, 8 + i) / denom
        }
        return (1 - 2 * sign) * Math.pow(16.0, exponent - 64) * fraction
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-07
      • 2022-01-16
      • 2013-08-31
      • 2011-11-25
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多