2016-05-07 22 views
5

Javascript speichert alle Zahlen als doppelter Genauigkeit 64-Bit-Format IEEE 754 Werte nach dem spec:Gibt es eine Möglichkeit, eine Zahl zu sehen, darin 64 ist Bit float IEEE754 Darstellung

Die Typennummer genau 18437736874454810627 (das heißt, 2 -2 +3) Werte, die das doppeltgenauen 64-Bit-Format IEEE 754 Werte wie für binäre Gleitkommaarithmetik Arithmetic

in dem IEEE-Standard spezifizierte

Gibt es eine Möglichkeit, die Nummer in diesem Formular in Javascript zu sehen?

Antwort

1

Basierend auf @ Zipfel Vorschlag ich die folgende Funktion implementiert haben eine Reihe zu bekommen es 64 Bit float IEEE754 Darstellung ist:

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

Sie können typisierte Arrays verwenden, um die rohen Bytes einer Zahl zu untersuchen. Erstellen Sie ein Float64Array mit einem Element, und erstellen Sie dann ein Uint8Array mit demselben Puffer. Sie können dann das erste Element des Float-Arrays auf Ihre Nummer setzen und die Bytes über die Uint8Array untersuchen. Sie müssen etwas verschieben und kombinieren für die verschiedenen Stücke der Anzahl der Kurse, aber es ist nicht schwer.

Es gibt keine eingebauten Einrichtungen, um Dinge wie den Exponenten zu extrahieren.

+0

Dank, habe ich versucht, die folgende 'var f = new Float64Array (1); f [0] = -12; new Uint8Array (f.buffer) .join() 'und es gab diese' 0,0,0,0,0,0,40,192' zurück - ich erwartete nur Nullen und Einsen, aber es gibt '40' und' 192' drin. Was mache ich falsch? –

+1

Nun, das 'Uint8Array' enthält 8 8-Bit-Werte. Wenn Sie sie als binär sehen wollen, können Sie '.toString (2)' auf jedem Byte verwenden - Sie müssen auch das Array in umgekehrter Reihenfolge durchlaufen, wie Sie sehen können - die "interessanten" Bytes sind bei das Ende. Das '192' ist das Vorzeichenbit und der Exponent, und dann ist' 40' der wichtigste Teil der Mantisse. – Pointy

+0

Ich sehe, danke. Ich werde es versuchen. _Sie müssen das Array in umgekehrter Reihenfolge durchlaufen, _ - ist es wegen 'Little Endian Byte Order'? –