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.
Hai provato a cercare qualche controesempio che potrebbe provarlo * non è * sempre corretto? – Purag
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
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