Ruby traccia solo il IEEE 754 Floating Point Standard. Quella pagina di Wikipedia non è male a spiegare ciò che stai vedendo. Molte lingue moderne adottano lo stesso approccio.
Intuitivamente, il comportamento che si vede ha perfettamente senso. In generale,
1/<small number> = <big number>
Pertanto nel limite,
1/0 -> Infinity and similarly -1/0 -> -Infinity
Infinity
è una costante compresa dal sottosistema virgola mobile. D'altra parte
0/<any non-zero> = 0
Quindi abbiamo un conflitto su 0/0. Dovrebbe essere zero o infinito? La risposta standard IEEE è "Not a Number", lo NaN
che stai vedendo, un'altra costante a virgola mobile.
Le costanti NaN
e più o meno Infinity
si propagano attraverso le espressioni in un modo che ha anche senso. Per esempio:
Infinity + <any (necessarly finite) number> = Infinity
e
<any number> + NaN = NaN
E cosa ancor più interessante:
1/Infinity = 0
che si può provare da soli:
irb(main):005:0> 1.0/(1.0/0.0)
=> 0.0
In questo modo un calcolo a virgola mobile può continua anche quando ha overflow o diviso per zero e produce comunque una risposta ragionevolmente informativa (anche se dopo aver conosciuto bene lo standard, vedrai che affidarti alla risposta è di solito una cattiva idea).
Questo è lontano dall'unico comportamento fornito dallo standard. Altri possono essere selezionati Ma Ruby fa questo per te. Il file sorgente numeric.c, funzione Init_Numeric
, imposta il processore host in modo che la divisione per zero propaga gli infiniti. Altre lingue potrebbero fare altre scelte, ad esempio per generare un'eccezione.
I galleggianti non sono gli stessi di ints. Sembra che tu abbia già elencato i problemi. Cose come NaN e Infinity sono tipiche per i galleggianti. –
@DaveNewton ma non vi è eccezione nel caso dei float, perché è così? – ZX12R
Perché non si tratta di un'eccezione quando si ha a che fare con l'aritmetica in virgola mobile; c'è un valore ben definito ('Infinity' o' NaN'). Vedi https://en.wikipedia.org/wiki/IEEE_floating_point#Exception_handling dal link di Gene. –