JS-4 bytes para número de ponto flutuante de precisão única

Tipo de dados JS

JSÉ uma linguagem de digitação fraca. Seus tipos de dados incluem valores de string, valores numéricos, valores booleanos, matrizes e objetos. Embora nossos tipos numéricos incluam inteiros de ponto flutuante etc., eles são coletivamente referidos aqui 数值类型. Ao mesmo tempo, JavaScripttem um tipo dinâmico, sem especificar quando definimos o tipo de dados da variável. Isso também significa que nossa conversão forçada será inválida em JS.

Se o C/C++pode ser alcançado pela memória de conversão ou complexo. Mas JavaScriptesses métodos são ineficazes (também, ou não sei como virar também cai).

IEEE754É agora reconhecida como a operação de conversão de ponto flutuante padrão mais amplamente usada, por muitos CPUusados ​​pela unidade de ponto flutuante.

IEEEE475

Então, primeiro olhamos para IEEEE475o Floatformato, existe 32bitpara armazenamento de dados, específico dividido da seguinte forma:

Insira a descrição da imagem aqui
Aqui, tomamos 0x4128BC90como exemplo para explicar:

0x4128BC90(H) = 01000001001010001011110010010000(B)

Sinal (bit de sinal)

  • 0 Exibir número positivo
  • 1 Representa um número negativo

Expoente (bit expoente)

1000 0010(B) = 130 (D)

Significand (casas decimais)

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

Fórmula de conversão

F un (x) = (- 1) S ign × (1 + S ignificand) × (2) E xponente - 127 Fun (x) = (-1) ^ {Sign} \ times (1 + Significand) \ times ( 2) ^ {Expoente - 127} 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 - 1 2 7

Método de conversão

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));

Ferramentas online

A seguir estão duas ferramentas online que eu pessoalmente recomendo que são muito adequadas para verificação:

Flutuante (IEEE754 precisão simples de 32 bits)

Conversor de base online_conversão de ponto flutuante

Referência obrigado

Convertendo hexadecimal em flutuante em javascript

Fundamentos de computador - conversão de números de ponto flutuante padrão IEEE754

Acho que você gosta

Origin blog.csdn.net/weixin_40774605/article/details/107323049
Recomendado
Clasificación