2009-02-03 4 views
7

Gibt es eine Möglichkeit, eine Zahl mit mehr als 53-Bit-Genauigkeit in JavaScript darzustellen? Mit anderen Worten, gibt es eine Möglichkeit, eine 64-Bit-Präzisionszahl darzustellen?JavaScript 64 Bit numerische Genauigkeit

Ich versuche, eine Logik zu implementieren, in der jedes Bit einer 64-Bit-Zahl etwas darstellt. Ich verliere die niedrigerwertigen Bits, wenn ich versuche, Bits höher als 2^53 zu setzen.

Math.pow(2,53) + Math.pow(2,0) == Math.pow(2,53) 

Gibt es eine Möglichkeit, eine benutzerdefinierte Bibliothek oder etwas zu implementieren, um dies zu erreichen?

+0

Aus irgendeinem besonderen Grund können Sie es nicht in zwei Variablen aufteilen oder stattdessen eine Zeichenfolge oder ein Array verwenden? – some

+0

Teilen Sie es in 2 Variablen ist die Lösung, die ich jetzt sehe. String und Array scheinen ineffizient zu sein, weil ich nur wenige der 64 Bits verwenden würde. Vielen Dank. –

Antwort

0

Das GWT-Team hat eine lange Emulation-Unterstützung hinzugefügt, so dass Java 64 Bit wirklich hält. Möchten Sie 64-Bit-Floats oder ganze Zahlen?

+0

ganze Zahlen. Ich werde die GWT-Implementierung betrachten. Vielen Dank. –

0

Ich würde nur entweder ein Array von ganzen Zahlen oder eine Zeichenfolge verwenden.

Die Zahlen in Javascript sind Doubles, ich denke, es ist ein Rundungsfehler in Ihrer Gleichung beteiligt.

+0

Ich denke Arrays und String wäre hier eine ineffiziente Datenstruktur. Weil ich nur einige der 64 Bits verwenden würde. Momentan denke ich über 2 numerische Typen für höhere 32 und niedrigere 32 Bits nach. Danke –

+0

Das Problem ist, dass Sie sich nicht darauf verlassen können, dass ein Double konsistent ist, wenn Sie versuchen, Bit-Manipulation zu machen. Javascript ist nicht für die Manipulation von Daten auf der Bit-Ebene vorgesehen. –

+0

Holen Sie sich Ihren Standpunkt. Ich bin ein Experte für Javascript oder Gleitkommazahlen, gibt es einen Datentyp in js, der Festkommaarithmetik verwendet? –

0

Vielleicht hätte ich ein paar technische Details hinzufügen müssen. Im Grunde verwendet die GWT-Long-Emulation ein Tupel von zwei Zahlen, wobei die erste die hohen 32 Bits und die zweiten die niedrigen 32 Bits der 64-Bit-Länge halten.

Die Bibliothek enthält natürlich Methoden zum Hinzufügen von Sachen wie das Hinzufügen von zwei "Longs" und das Erhalten eines "langen" Ergebnisses. In Ihrem GWT Java-Code sieht es einfach aus wie zwei reguläre Longs - man muss nicht geifern oder sich des Tupels bewusst sein. Durch die Verwendung dieses Ansatzes vermeidet GWT das Problem, auf das Sie wahrscheinlich anspielen, nämlich "Longs", bei denen die unteren Bits der Genauigkeit fallen gelassen werden, was in vielen Fällen nicht akzeptabel ist.

Während Floats definitionsgemäß ungenau sind/Näherungen eines Wertes, ist eine ganze Zahl wie ein Long nicht. GWT hält immer 64 Bit lang - Mathe, die solche Longs verwenden, verwenden niemals Präzision. Die Ausnahme sind Überläufe, die aber genau dem entsprechen, was in Java usw. auftritt, wenn Sie zwei sehr große lange Werte hinzufügen, die mehr als 64 Bits benötigen - z. B. 2^32-1 + 2^32-1.

Um dasselbe für Gleitkommazahlen zu tun, wird ein ähnlicher Ansatz benötigt. Sie benötigen eine Bibliothek, die ein Tupel verwendet.

-7

Warum sollte jemand 64-Bit-Genauigkeit in Javascript benötigen?

Lange halten manchmal ID von Sachen in einem DB, so dass es wichtig ist, einige der unteren Bits nicht zu verlieren ... aber die Gleitkommazahlen werden meistens für Berechnungen verwendet. Floats zu verwenden, um monetäre oder ähnliche genaue Werte zu halten, ist einfach falsch. Wenn Sie wirklich 64-Bit-Präzision brauchen, tun Sie die Mathematik auf dem Server, wo es schneller ist und so weiter.

+0

Beantworten einer Frage mit einer Frage ist nie hilfreich. Plus, serverseitige JavaScript wird immer häufiger. – scotts

+0

Weil vielleicht nur vielleicht der Fragesteller das Falsche tut, weil sie nicht wissen, was sie tun ... –

-1

Ja, 11 Bit sind für Exponenten reserviert, nur 52 Bits enthalten Wert auch als Bruch bezeichnet. Javascript ermöglicht bitweise Operationen auf Zahlen, aber nur die ersten 32 Bits werden in diesen Operationen gemäß der Javascript-Standardspezifikation verwendet.

Ich verstehe nicht irreführende GWT/Java/lange Antworten in Javascript/Doppel Frage obwohl? Javascript ist nicht Java.

1

Googles Closure-Bibliothek hat goog.math.Long für diesen Zweck.

+0

Der Typ, der den ProtoBuf-JavaScript-Code schrieb, isolierte auch Long von der Closure-Bibliothek, so dass Sie es eigenständig verwenden können: https://github.com/dcodeIO/Long.js – SomeCallMeTim