2015-07-11 17 views
10

Dato il seguente codice, dove entrambi a e b sono Number s che rappresentano i valori all'interno della gamma di firmato interi con segno a 32 bit:Javascript: è questa divisione intera verità Firmato

var quotient = ((a|0)/(b|0))|0; 

e supponendo che il tempo di esecuzione è nel pieno rispetto delle specifiche ECMAScript 6, il valore di quotientè sempre la divisione di interi con segno corretta di a e come numeri interi? In altre parole, si tratta di un metodo corretto per ottenere una vera divisione integrale con segno in JavaScript equivalente all'istruzione della macchina?

+1

Hai provato a cercare qualche controesempio che potrebbe provarlo * non è * sempre corretto? – Purag

+1

Non ho. Dal momento che JavaScript si occupa formalmente in tutti i punti in virgola mobile, vedrei che la domanda che sta arrivando a, è il risultato della doppia divisione di precisione di due interi matematici nell'intervallo di un intero con segno a 32 bit, seguito da un troncamento in un 32 bit numero intero con segno e una simulazione di overflow in base all'operazione astratta 'ToInt32() specificata da EMCAScript 6, equivalente a una divisione intera degli stessi valori matematici? Non mi sembra di capire il processo della divisione in virgola mobile abbastanza bene da rispondere a me stesso o ricavare controesempi, motivo per cui ho chiesto qui. – Textfield

+1

Per divisione per zero, no - restituisce 0 invece di generare un'eccezione: https://stackoverflow.com/questions/29179876/how-does-asm-js-handle-divide-by-zero – gengkev

risposta

4

Non sono esperto di numeri in virgola mobile, ma Wikipedia dice che i doppi hanno 52 bit di precisione. Logicamente, sembra che 52 bit dovrebbero essere sufficienti per approssimare in modo affidabile la divisione intera di interi a 32 bit.

La divisione delle firme minime e massime a 32 bit, -2147483648/2147483647, produce -1.0000000004656613, che è ancora una quantità ragionevole di cifre significative. Lo stesso vale per il suo inverso, 2147483647/-2147483648, che produce -0.9999999995343387.

Un'eccezione è division by zero, che ho menzionato in un commento. Come afferma la domanda SO collegata, la divisione intera per zero normalmente genera una sorta di errore, mentre la coercizione a virgola mobile produce (1/0) | 0 == 0.

Aggiornamento: Secondo another SO answer, integer divisione in C tronca a zero, che è ciò che fa |0 in JavaScript. Inoltre, la divisione per 0 non è definita, pertanto JavaScript non è tecnicamente corretto nel restituire zero. A meno che non mi sia perso qualcos'altro, la risposta alla domanda originale dovrebbe essere sì.

Aggiornamento 2: sezioni pertinenti del ECMAScript 6 specifiche: come divide numbers e come convert to a 32-bit signed integer, che è what |0 does.