2009-11-24 8 views

risposta

14

Senza

Almeno alcuni bit di un doppio 64-bit devono essere usati per rappresentare l'esponente (posizione del punto binario), e quindi vi sono meno di 64 bit disponibili per il numero effettivo . Quindi no, un doppio a 64 bit non può rappresentare tutti i valori che un intero a 64 bit può (e viceversa).

+1

Bene: è vero fino a quando non si ha alcuna funzione di mappatura tra il numero in virgola mobile e il numero intero di 64 bit. È possibile "rappresentare" il numero come un numero in virgola mobile diverso. Non è solo pratico :) – viraptor

+2

Anche la soluzione impraticabile potrebbe non funzionare - ad esempio, un valore di NaN di segnalazione (Snan) potrebbe innescare un'eccezione se gestita all'interno di Lua (idea se questo è vero - ma potrebbe). – stusmith

+1

Alcuni valori per i doppi vengono denormalizzati: se la tua lingua potrebbe rinormalizzarli senza preavviso, non puoi inserire in modo sicuro 64 bit di informazioni. – bdonlan

4

Il doppio è un tipo 64bit stessa. Tuttavia perdi 1 bit per il segno e 11 per l'esponente.

Quindi la risposta è no: non può essere fatto.

+3

guadagni un po 'perché il più alto è sempre diverso da zero, cioè la precisione è 'total_bits - sign_bit - exp_bits + implicit_bit = 64 - 1 - 11 + 1 = 53' – Christoph

+0

Non capisco la tua spiegazione. Capisco che si possa 'fare un cattivo' uso del bit del segno per un range numerico aumentato. (Quindi, fondamentalmente usando i numeri negativi per aumentare il range positivo) – Toad

+1

@reiner. Ad esempio, il decimale binario 0,01 ... (51 più 1s) ... 1 è esattamente rappresentabile in un doppio IEEE, anche se ha 53 cifre significative. È rappresentato da un esponente di -2 (prendendo 11 bit), un segno di 0 (prendendo 1 bit) e una mantissa di 1 ... (50 1s) ... 1 (prendendo 52 bit). Il primo 1 non è memorizzato da nessuna parte, si presume. Sceglieresti sempre un esponente in modo tale che il "primo" bit della mantissa sia 1, in modo che il primo bit sia appena tralasciato. L'eccezione è denorms, che vengono gestiti in modo leggermente diverso (o non del tutto). –

-1

Non so niente di lua
ma se si potesse capire come per la modifica dei bit per bit del galleggiante in questa lingua, si potrebbe in teoria fare una classe wrapper che ha preso il tuo numero sotto forma di una stringa e impostare la bit del galleggiante nell'ordine che rappresenta il numero diedero
una soluzione più pratica sarebbe quella di utilizzare qualche libreria bignum

3

Dalla memoria, un double può rappresentare un intero con segno 53 bit esattamente.

1

Su 64 bit è possibile memorizzare solo 2^64 codici diversi. Ciò significa che un tipo a 64 bit che può rappresentare 2^64 numeri interi non ha spazio per rappresentare qualcos'altro, come numeri in virgola mobile.

Ovviamente il doppio può rappresentare molti numeri non interi, quindi non può soddisfare le vostre esigenze.

5

Anche se hai ottenuto alcune buone risposte alla tua domanda sui tipi a 64 bit, potresti comunque volere una soluzione pratica al tuo problema specifico. La soluzione più affidabile che conosco è quella di creare Lua 5.1 con la patch LNUM (nota anche come patch di Lua integer) che può essere scaricata da LuaForge. Se non stai pianificando di creare Lua dalla sorgente C, c'è almeno una libreria Lua pura che gestisce interi con segno a 64 bit - vedi il wiki Lua-users.

+0

Grazie per i riferimenti, +1. –

2

No, non è possibile utilizzare Double per memorizzare interi a 64 bit senza perdere precisione.

Tuttavia, è possibile applicare una patch Lua che aggiunge il supporto per veri interi a 64 bit all'interprete Lua. Applica la patch LNUM al tuo sorgente Lua e ricompila.

0

IEEE 754 double non possono rappresentare esattamente gli interi a 64 bit. Tuttavia, può rappresentare esattamente ogni valore intero a 32 bit.

Problemi correlati