JS - 4字节转单精度浮点数

JS 数据类型

JS 是一种弱类型的语言,它的数据类型包含字符串值,数值,布尔值,数组,对象。虽然我们的数值类型包含浮点数整数等,但是在这里统称为 数值类型。同时 JavaScript 拥有动态类型,我们定义变量时无须指定数据类型。这也意味着我们的强制转换在JS中将失效。

若在 C/C++ 中,可以通过内存转换或联合体实现。但在 JavaScript 中这些方法是无效的(亦或是我太 cai 不知道怎么转)。

IEEE754 是现在公认的、最广泛使用的浮点数转换运算标准,被许多 CPU 与浮点运算器所采用。

IEEEE475

那我们先来看一下 IEEEE475Float 格式,有 32bit 以供数据存储,具体划分如下:

在这里插入图片描述
这里我们以 0x4128BC90 为例进行讲解:

0x4128BC90(H) = 01000001001010001011110010010000(B)

Sign(符号位)

  • 0 表示正数
  • 1 表示负数

Exponent(指数位)

1000 0010(B) = 130 (D)

Significand(小数位)

01010001011110010010000(B) = 0*2^(-1) + 1*2^(-2) + ... + 0*2^(-23)

转换公式

F u n ( x ) = ( − 1 ) S i g n × ( 1 + S i g n i f i c a n d ) × ( 2 ) E x p o n e n t − 127 Fun(x) = (-1)^{Sign} \times (1 + Significand) \times (2)^{Exponent - 127} Fun(x)=(1)Sign×(1+Significand)×(2)Exponent127

转换方法

var bytes = new Array();

bytes[0] = 65;
bytes[1] = 40;
bytes[2] = 188;
bytes[3] = 144;

//IEEE754
function hex2float(num) {
    
    
  	//符号位
    var sign = (num & 0x80000000) ? -1 : 1;
  	//指数位
    var exponent = ((num >> 23) & 0xff) - 127;
  	//尾数位
    var mantissa = 1 + ((num & 0x7fffff) / 0x7fffff);
    return sign * mantissa * Math.pow(2, exponent);
}

//拼接为number对象
var mfloat = ((bytes[0] & 0xFF) << 24) | 
	((bytes[1] & 0xFF) << 16) | 
	((bytes[2] & 0xFF) << 8) | 
	(bytes[3] & 0xFF);

console.log(hex2float(mfloat));

在线工具

以下是个人推荐的两个在线工具,用于验证非常合适:

Float (IEEE754 Single precision 32-bit)

在线进制转换器_浮点数转换

参考鸣谢

Converting hexadecimal to float in javascript

计算机基础——IEEE754标准的浮点数的转化

猜你喜欢

转载自blog.csdn.net/weixin_40774605/article/details/107323049