Ruby はIEEE 754 Floating Point Standardを追跡するだけです。そのウィキペディアのページは、あなたが見ているものをうまく説明しています。多くの現代言語は同じアプローチをとっています。
直感的に、あなたが目にする行動は完全に理にかなっています。一般に、
1/<small number> = <big number>
したがって極限では、
1/0 -> Infinity and similarly -1/0 -> -Infinity
Infinity
浮動小数点サブシステムが認識する定数です。一方で
0 / <any non-zero> = 0
したがって、0/0 で競合が発生します。ゼロか無限大か?IEEE 標準の答えは「数値ではない」NaN
です。ご覧のとおり、もう 1 つの浮動小数点定数です。
定数NaN
とプラスまたはマイナスInfinity
は、意味のある方法で式を介して伝播します。例えば:
Infinity + <any (necessarly finite) number> = Infinity
と
<any number> + NaN = NaN
さらに興味深いことに:
1 / Infinity = 0
自分で試すことができるもの:
irb(main):005:0> 1.0 / (1.0 / 0.0)
=> 0.0
このようにして、浮動小数点の計算は、オーバーフローしたり、ゼロで除算したりしても、妥当な情報を提供する答えを生成することができます (ただし、標準を十分に理解した後で、答えに依存することは通常悪い考えであることがわかります)。
これは、標準が提供する唯一の動作ではありません。その他は選択可能です。しかし、Ruby がこれを行います。ソース ファイルnumeric.c、 functionInit_Numeric
は、ホスト プロセッサを設定して、ゼロによる除算が無限大に伝播するようにします。他の言語では、例外を生成するなど、他の選択が行われる場合があります。