2009-11-24 7 views

Antwort

14

Keine

Mindestens einige Bits einer 64-Bit-Doppel verwendet werden müssen, um den Exponenten (Position des Binärkomma) darzustellen, und somit gibt es weniger als 64-Bits für die tatsächliche Anzahl . Also nein, ein 64-Bit-Double kann nicht alle Werte repräsentieren, die eine 64-Bit-Ganzzahl haben kann (und umgekehrt).

+1

Nun - das ist wahr, solange Sie keine Abbildungsfunktion zwischen der Fließkommazahl und 64b Ganzzahl haben. Sie können die Nummer als eine andere Gleitkommazahl "darstellen". Es ist einfach nicht praktisch :) – viraptor

+2

Selbst die unpraktische Lösung funktioniert möglicherweise nicht - zum Beispiel könnte ein Signalisierungs-NaN (SNaN) -Wert eine Ausnahme auslösen, wenn er innerhalb von Lua gehandhabt wird (keine Ahnung, ob das stimmt - aber es könnte sein). – stusmith

+1

Einige Werte für doubles sind denormalized - wenn Ihre Sprache sie ohne Warnung renormieren könnte, können Sie 64-Bit-Informationen nicht sicher hineinpassen. – bdonlan

4

Das Double ist ein 64-Bit-Typ. Sie verlieren jedoch 1 Bit für das Vorzeichen und 11 für den Exponenten.

Also die Antwort ist nein: es kann nicht getan werden.

+3

Sie erhalten ein Bit, weil die höchste immer ungleich Null ist, dh die Genauigkeit ist 'total_bits - sign_bit - exp_bits + implizite_bit = 64 - 1 - 11 + 1 = 53' – Christoph

+0

Ich verstehe Ihre Erklärung nicht. Ich verstehe, dass man das Zeichenbit für einen vergrößerten numerischen Bereich "missbrauchen" könnte. (Also im Grunde die negativen Zahlen verwenden, um den positiven Bereich zu erhöhen) – Toad

+1

@reiner. Zum Beispiel ist die binäre Dezimalstelle 0.01 ... (51 mehr 1s) ... 1 in einem IEEE-Doppel genau darstellbar, obwohl sie 53 signifikante Zahlen hat. Es wird durch einen Exponenten von -2 (11 Bit), ein Vorzeichen von 0 (1 Bit) und eine Mantisse von 1 ... (50 1s) ... 1 (mit 52 Bits) dargestellt. Die erste 1 wird nirgendwo gespeichert, es wird angenommen. Sie würden immer einen Exponenten wählen, so dass das "erste" Bit der Mantisse 1 ist, so dass das erste Bit gerade weggelassen wird. Die Ausnahme sind Denorms, die etwas anders (oder gar nicht) behandelt werden. –

-1

Ich weiß nichts über lua
aber wenn Sie herausfinden können, wie bitweise Manipulation des Schwimmers in dieser Sprache durchzuführen, Sie könnte theoretisch eine Wrapper-Klasse, die Ihre Nummer in Form einer Zeichenfolge nahm und stellen Sie die Bits des Schwimmers in der Reihenfolge, die die Zahl repräsentiert gab man es
eine praktischere Lösung einige bignum Bibliothek

3

aus dem Gedächtnis zu verwenden wäre, ein double kann genau eine 53-Bit-Ganzzahl mit Vorzeichen darstellen.

1

Auf 64 Bits können Sie nur 2^64 verschiedene Codes speichern. Dies bedeutet, dass ein 64-Bit-Typ, der 2^64 ganze Zahlen darstellen kann, keinen Platz hat, um etwas anderes darzustellen, wie z. B. Fließkommazahlen.

Offensichtlich Doppel kann viele Nicht-Ganzzahlen darstellen, so dass es nicht Ihren Anforderungen entsprechen kann.

5

Obwohl Sie einige gute Antworten auf Ihre Frage zu 64-Bit-Typen erhalten haben, möchten Sie vielleicht immer noch eine praktische Lösung für Ihr spezifisches Problem. Die zuverlässigste Lösung, die ich kenne, besteht darin, Lua 5.1 mit dem LNUM-Patch (auch bekannt als Lua-Integer-Patch) zu erstellen, der von LuaForge heruntergeladen werden kann. Wenn Sie nicht beabsichtigen, Lua aus der C-Quelle zu erstellen, gibt es mindestens eine reine Lua-Bibliothek, die 64-Bit-Ganzzahlen mit Vorzeichen verarbeitet - siehe das Lua-Benutzer-Wiki.

+0

Danke für die Referenzen, +1. –

2

Nein, Sie können Double nicht zum Speichern von 64-Bit-Ganzzahlen verwenden, ohne die Genauigkeit zu verlieren.

Sie können jedoch einen Lua-Patch anwenden, der dem Lua-Interpreter Unterstützung für echte 64-Bit-Ganzzahlen hinzufügt. Wenden Sie den Patch LNUM auf Ihre Lua-Quelle an und kompilieren Sie sie erneut.

0

IEEE 754 Double kann 64-Bit-Ganzzahlen nicht genau darstellen. Es kann jedoch genau jeden 32-Bit-Integer-Wert darstellen.