简体   繁体   English

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

[英]How can I convert IBM floating point to JavaScript numbers?

I want to read data from in an old file format.我想从旧文件格式中读取数据。 The format uses IBM floating point numbers, and I want to read it in a JavaScript program.该格式使用IBM 浮点数,我想在 JavaScript 程序中读取它。 IBM floating point representation was used on the IBM System/360 . IBM 浮点表示用于IBM System/360

How can I convert the IBM floating points to JavaScript numbers?如何将 IBM 浮点数转换为 JavaScript 数字?

This function takes a buffer of little endian IBM floats and converts them to a number:此函数采用小端 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
}

Note that special cases like NaN, Infinity, etc. is not covered.请注意,未涵盖 NaN、Infinity 等特殊情况。

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

A small update to Hallgrim's solution, which allows to handle double-precision floats: 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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在JavaScript中,应该调用parseFloat将字符串转换为浮点数,还是应该让JavaScript将它们转换? - In a JavaScript, should I call parseFloat to convert strings to floating point numbers, or should I let JavaScript convert them? Javascript | 浮点数字 - Javascript | floating point numbers 在JavaScript中添加浮点数 - Addition of floating point numbers in JavaScript JavaScript中是否有浮点数? - Are there floating-point numbers in JavaScript? Javascript中浮点数的精度可以成为非确定性的来源吗? - Can precision of floating point numbers in Javascript be a source of non determinism? 在 JavaScript 中,如何确保浮点数保持在 32 位以下? - In JavaScript, how do I ensure floating point numbers stay under 32bits? JavaScript 中的大数和浮点数 - Big numbers and floating point numbers in JavaScript 我可以在div ID中使用浮点数吗? - Can I use floating point numbers inside div IDs? 如何以短格式显示浮点数并且仍然能够在这个 Vue 应用程序中进行计算? - How can I display floating point numbers in a short format and still be able to do calculations in this Vue application? 如何在Javascript中将浮点小数点从点转换为逗号 - How to convert floating point decimal separator from dot to comma in Javascript
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM