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

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

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

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

javascript floating-point
2个回答
3
投票

此函数采用小尾数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移植的


0
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.