2016-05-07 57 views
5

Javascript memorizza tutti i numeri come formato doppia precisione a 64 bit IEEE 754 valori in base alla spec:C'è un modo di vedere un numero nella sua float rappresentazione IEEE754 a 64 bit

il tipo di numero ha esattamente 18437736874454810627 (cioè, 2 -2 +3) valori, che rappresenta la doppia precisione formato a 64 bit IEEE 754 valori come specificato nello standard IEEE standard per binari a virgola mobile aritmetica

C'è un modo per vedere il numero in questo modulo in Javascript?

risposta

1

Sulla base @ suggerimento di Pointy Ho implementato la seguente funzione per ottenere un numero in è 64 bit a virgola mobile rappresentazione IEEE754:

function to64bitFloat(number) { 
    var f = new Float64Array(1); 
    f[0] = number; 
    var view = new Uint8Array(f.buffer); 
    var i, result = ""; 
    for (i = view.length - 1; i >= 0; i--) { 
     var bits = view[i].toString(2); 
     if (bits.length < 8) { 
      bits = new Array(8 - bits.length).fill('0').join("") + bits; 
     } 
     result += bits; 
    } 
    return result; 
} 

console.log(to64bitFloat(12)); // 0100000000101000000000000000000000000000000000000000000000000000 
console.log(to64bitFloat(-12)); // 1100000000101000000000000000000000000000000000000000000000000000 
2

È possibile utilizzare matrici digitate per esaminare i byte non elaborati di un numero. Creare un Float64Array con un elemento e quindi creare uno Uint8Array con lo stesso buffer. È quindi possibile impostare il primo elemento dell'array float sul proprio numero ed esaminare i byte tramite lo Uint8Array. Dovrai fare qualche spostamento e combinazione per i vari pezzi del numero, naturalmente, ma non è difficile.

Non ci sono strutture integrate per fare cose come estrarre l'esponente.

+0

grazie, ho provato la seguente 'var f = new Float64Array (1); f [0] = -12; nuovo Uint8Array (f.buffer) .join() 'e ha restituito questo' 0,0,0,0,0,0,40,192' - Mi aspettavo solo zeri e uno, ma ci sono '40' e' 192' dentro. Che cosa sto facendo di sbagliato? –

+1

Bene, 'Uint8Array' conterrà 8 valori a 8 bit. Se vuoi vederli come binari, puoi usare '.toString (2)' su ogni byte - inoltre, dovrai passare attraverso l'array in ordine inverso, come puoi vedere - i byte "interessanti" sono a fine. Questo '192' è il bit del segno e l'esponente, e quindi' 40' è la parte più significativa della mantissa. – Pointy

+0

Vedo, grazie. Ci proverò. Dovrai passare attraverso la schiera in ordine inverso, _ - è dovuto a 'Little Endian Byte Order'? –