首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Javascript中将浮点数转换为其二进制表示形式(IEEE754)?

如何在Javascript中将浮点数转换为其二进制表示形式(IEEE754)?
EN

Stack Overflow用户
提问于 2010-06-23 03:56:45
回答 2查看 11.5K关注 0票数 25

在Javascript中,将浮点数转换为二进制表示的最简单方法是什么?(例如1.0 -> 0x3F800000)。

我尝试过手动操作,这在某种程度上(对于通常的数字)有效,但对于非常大或非常小的数字(没有范围检查)和特殊情况(NaN、无穷大等),它都失败了:

代码语言:javascript
复制
function floatToNumber(flt)
{
    var sign = (flt < 0) ? 1 : 0;
    flt = Math.abs(flt);
    var exponent = Math.floor(Math.log(flt) / Math.LN2);
    var mantissa = flt / Math.pow(2, exponent);

    return (sign << 31) | ((exponent + 127) << 23) | ((mantissa * Math.pow(2, 23)) & 0x7FFFFF);
}

我是在重新发明轮子吗?

编辑:我改进了我的版本,现在它可以处理特殊情况。

代码语言:javascript
复制
function assembleFloat(sign, exponent, mantissa)
{
    return (sign << 31) | (exponent << 23) | (mantissa);
}

function floatToNumber(flt)
{
    if (isNaN(flt)) // Special case: NaN
        return assembleFloat(0, 0xFF, 0x1337); // Mantissa is nonzero for NaN

    var sign = (flt < 0) ? 1 : 0;
    flt = Math.abs(flt);
    if (flt == 0.0) // Special case: +-0
        return assembleFloat(sign, 0, 0);

    var exponent = Math.floor(Math.log(flt) / Math.LN2);
    if (exponent > 127 || exponent < -126) // Special case: +-Infinity (and huge numbers)
        return assembleFloat(sign, 0xFF, 0); // Mantissa is zero for +-Infinity

    var mantissa = flt / Math.pow(2, exponent);
    return assembleFloat(sign, exponent + 127, (mantissa * Math.pow(2, 23)) & 0x7FFFFF);
}

我仍然不确定这是否100%正确工作,但它似乎工作得足够好。(我仍然在寻找现有的实现)。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3096646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档