Ruby verfolgt nur die IEEE 754 Floating Point Standard. Diese Wikipedia-Seite ist nicht schlecht darin zu erklären, was Sie sehen. Viele moderne Sprachen verfolgen denselben Ansatz.
Intuitiv macht das Verhalten, das Sie sehen, Sinn. Im Allgemeinen
1/<small number> = <big number>
deshalb im Grenzfall,
1/0 -> Infinity and similarly -1/0 -> -Infinity
Infinity
ist eine Konstante, die durch das Gleitkomma-Subsystem verstanden. Auf der anderen Seite
0/<any non-zero> = 0
So haben wir einen Konflikt auf 0/0. Sollte es Null oder Unendlich sein? Die IEEE-Standardantwort ist "Not a Number", die NaN
Sie sehen, eine andere Gleitkommakonstante. Die Konstanten NaN
und plus oder minus Infinity
propagieren durch Ausdrücke in einer Weise, die auch Sinn ergibt. Zum Beispiel:
Infinity + <any (necessarly finite) number> = Infinity
und
<any number> + NaN = NaN
Und noch interessanter ist:
1/Infinity = 0
Welche können Sie selbst ausprobieren:
irb(main):005:0> 1.0/(1.0/0.0)
=> 0.0
Auf diese Weise wird eine Gleitkomma-Berechnung kann weiter, auch wenn es ist übergelaufen oder durch Null geteilt worden und erzeugt immer noch eine einigermaßen informative Antwort (obwohl, nachdem Sie den Standard gut kennen, Sie sehen werden, dass sich auf die Antwort zu verlassen, in der Regel eine schlechte Idee ist).
Dies ist bei weitem nicht das einzige Verhalten, das der Standard bietet. Andere können ausgewählt werden. Aber Ruby macht das für dich. Die Quelldatei numeric.c, Funktion Init_Numeric
, richtet den Host-Prozessor so ein, dass Division durch Null Unendlichkeiten fortpflanzt. Andere Sprachen treffen möglicherweise andere Möglichkeiten, um beispielsweise eine Ausnahme zu erzeugen.
Schwimmer sind nicht das gleiche wie Ints. Es sieht so aus, als ob Sie die Probleme bereits aufgezählt haben. Dinge wie NaN und Infinity sind typisch für Schwimmer. –
@DaveNewton, aber es gibt keine Ausnahme im Falle von Floats, warum ist das der Fall? – ZX12R
Da es sich bei der Gleitkommaarithmetik nicht um eine Ausnahme handelt; Es gibt einen wohldefinierten Wert ("Infinity" oder "NaN"). Siehe https://en.wikipedia.org/wiki/IEEE_floating_point#Exception_handling von Genes Link. –