Konvertiert eine Zeichenfolge mit einer Hexadezimaldarstellung eines IEEE-754-Double in eine numerische JavaScript-Variable

8

Angenommen, ich habe eine Hexadezimalzahl "4072508200000000" und möchte, dass die Gleitkommazahl (293.03173828125000) im IEEE-754-Doppelformat in eine JavaScript-Variable eingegeben wird.

Ich kann mir eine Art vorstellen, die Maskierung und einen Aufruf von pow () verwendet, aber gibt es eine einfachere Lösung?

Eine clientseitige Lösung wird benötigt.

Dies kann helfen. Es ist eine Website, auf der Sie eine Hex-Codierung eines IEEE-754 eingeben und eine Analyse von Mantisse und Exponent erhalten können.

Ссылка

Weil die Leute immer fragen "Warum?", hier ist der Grund: Ich versuche eine bestehende, aber unvollständige Implementierung von Googles Procol Buffers (Protobuf) auszufüllen.

    
Nosredna 20.10.2009, 22:37
quelle

3 Antworten

10

Ich kenne keinen guten Weg. Es kann sicherlich auf die harte Tour gemacht werden, hier ist ein Beispiel mit einer einzigen Genauigkeit innerhalb von JavaScript:

%Vor%

Eine Produktionsimplementierung sollte berücksichtigen, dass die meisten Felder magische Werte haben, die typischerweise implementiert werden, indem eine spezielle Interpretation für das angegeben wird, was am größten oder am kleinsten gewesen wäre. Ermitteln Sie also NaN s und Unendlichkeiten. Das obige Beispiel sollte nach Negativen suchen. (a & amp; 0x80000000)

Update: Ok, ich habe es auch für Doppelgänger. Sie können die obige Technik nicht direkt erweitern, da die interne JS-Repräsentation ein Double ist, und nach ihrer Definition kann sie bestenfalls eine Bit-Zeichenfolge der Länge 52 verarbeiten und sie kann sich nicht um mehr als 32 verschieben. p>

Ok, um double zu machen hacken Sie zuerst als String ab die niedrigen 8 Ziffern oder 32 Bits; Verarbeite sie mit einem separaten Objekt. Dann:

%Vor%

Ich habe das obige Beispiel beibehalten, weil es vom OP stammt. Ein härterer Fall ist, wenn die niedrigen 32 Bits einen Wert haben. Hier ist die Konvertierung von 0x40725082deadbeef, ein Full-Precision-Double:

%Vor%

Es gibt einige offensichtliche Unterausdrücke, die Sie ausklammern können, aber ich habe es auf diese Weise verlassen, damit Sie sehen können, wie es sich auf das Format bezieht.

    
DigitalRoss 20.10.2009, 23:38
quelle
4

Eine schnelle Ergänzung für die Lösung von DigitalRoss, für diejenigen, die diese Seite über Google finden, so wie ich es gemacht habe.

Abgesehen von den Randfällen für +/- Infinity und NaN, die ich gerne eingeben würde, muss man auch das Vorzeichen des Ergebnisses berücksichtigen:

%Vor%

Sie können dann s in die endgültige Multiplikation einfügen, um das korrekte Ergebnis zu erhalten.

Ich denke, für eine Little-Endian-Lösung müssen Sie auch die Bits in a und b umkehren und sie austauschen.

    
RandomEtc 22.11.2009 08:29
quelle
1

Der neue Mechanismus typisierte Arrays ermöglicht Ihnen dies (und ist wahrscheinlich ein idealer Mechanismus zur Implementierung von Protokollpuffern):

%Vor%

Dies setzt eine Little-Endian-Maschine voraus.

Leider hat Chrome Float64Array nicht, obwohl es Float32Array hat. Das obige Beispiel funktioniert in Firefox 4.0.1.

    
nibot 15.06.2011 16:47
quelle

Tags und Links