2009-02-03 16 views
7

Esiste un modo per rappresentare un numero con una precisione superiore a 53 bit in JavaScript? In altre parole, esiste un modo per rappresentare il numero di precisione a 64 bit?JavaScript Precisione numerica a 64 bit

Sto cercando di implementare una logica in cui ogni bit di un numero a 64 bit rappresenta qualcosa. Perdo i bit meno significativi quando provo a impostare bit superiori a 2^53.

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

C'è un modo per implementare una libreria personalizzata o qualcosa per raggiungere questo obiettivo?

+0

Alcuni motivi speciali non possono essere divisi in due variabili o utilizzare una stringa o un array? – some

+0

Dividerlo in 2 variabili è la soluzione che vedo ora. la stringa e l'array sembrano essere inefficienti, perché utilizzerei solo pochi dei 64 bit. Grazie. –

risposta

0

Il team di GWT ha aggiunto un lungo supporto di emulazione in modo che java long abbia davvero 64 bit. Vuoi float a 64 bit o numeri interi?

+0

numeri interi. Guarderò all'implementazione di GWT. Grazie. –

0

Vorrei utilizzare solo una matrice di numeri interi o una stringa.

I numeri in javascript sono doppi, penso che ci sia un errore di arrotondamento nella tua equazione.

+0

Penso che array e string sarebbero una infrastruttura inefficiente qui. Perché userei solo pochi dei 64 bit. Attualmente sto pensando di usare 2 tipi numerici per 32 e 32 bit più bassi. Grazie –

+0

Il problema è che non si può fare affidamento su un doppio per essere coerenti se si tenta di manipolare i bit. Javascript non è fatto per manipolare i dati sul bit-layer. –

+0

Ottieni pienamente il tuo punto. Sono un esperto in javascript o in virgola mobile, esiste un tipo di dati in js che utilizza l'aritmetica in virgola fissa? –

0

Forse avrei dovuto aggiungere alcuni dettagli tecnici. Fondamentalmente l'emulazione lunga GWT utilizza una tupla di due numeri, il primo che contiene i 32 bit alti e il secondo i 32 bit bassi della lunghezza di 64 bit.

La libreria, ovviamente, contiene metodi per aggiungere cose come aggiungere due "long" e ottenere un risultato "lungo". All'interno del tuo codice Java GWT assomiglia a due long regolari: uno non ha bisogno di giocherellare o essere consapevole della tupla. Utilizzando questo approccio, GWT evita il problema a cui probabilmente stai alludendo, vale a dire i "lunghi" che eliminano i bit di precisione inferiori che in molti casi non sono accettabili.

Mentre i galleggianti sono per definizione imprecisi/approssimazioni di un valore, un numero intero come un lungo non lo è. GWT ha sempre una lunghezza di 64 bit: usare matematica così lunghe non usa mai la precisione. L'eccezione a ciò è l'overflow ma che corrisponde esattamente a ciò che accade in Java ecc. Quando si aggiungono due valori lunghi molto grandi che richiedono più di 64 bit, ad esempio 2^32-1 + 2^32-1.

Fare lo stesso per i numeri in virgola mobile richiede un approccio simile. Avrai bisogno di avere una libreria che usi una tupla.

-7

Perché qualcuno dovrebbe avere la precisione a 64 bit in javascript?

I long a volte contengono ID di materiale in un DB, quindi è importante non perdere alcuni dei bit più bassi ... ma i numeri in virgola mobile sono spesso utilizzati per i calcoli. Usare i float per mantenere valori monetari o simili è assolutamente sbagliato. Se hai davvero bisogno di precisione a 64 bit fai matematica sul server dove è più veloce e così via.

+0

Rispondere a una domanda con una domanda non è mai utile. Inoltre, JavaScript sul lato server sta diventando sempre più comune. – scotts

+0

Perché forse solo il richiedente sta facendo la cosa sbagliata, perché non sanno cosa stanno facendo ... –

-1

Sì, 11 bit sono riservati per esponente, solo un valore di contenimento di 52 bit chiamato anche frazione. Javascript consente operazioni bit a bit sui numeri ma solo i primi 32 bit vengono utilizzati in quelle operazioni in base alle specifiche standard JavaScript.

Non capisco ingannare GWT/Java/risposte lunghe in Javascript/doppia domanda però? Javascript non è Java.

1

La libreria di chiusura di Google ha goog.math.Long per questo scopo.

+0

Il tizio che ha scritto il codice JavaScript di ProtoBuf è anche isolato dalla libreria Closure per poterlo usare da solo: https://github.com/dcodeIO/Long.js – SomeCallMeTim

Problemi correlati