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の標準的な答えは "Not a Number"で、もう一つの浮動小数点定数であるNaN
があります。
定数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
をこのようにして浮動小数点計算することができますいつでもそれはあふれているか0で割っても合理的な有益な答えを生み出しています(あなたが標準を良く知っていれば、答えに頼っているのは悪い考えです)。
これは、標準が提供する唯一の動作とは異なります。他のものを選択することができます。しかしRubyはこれをあなたのために行います。ソースファイルnumeric.c、関数Init_Numeric
は、ゼロ除算が無限大になるようにホストプロセッサを設定します。他の言語では、例外を生成するなど、他の選択肢があります。
フロートはintsと同じではありません。既に問題を列挙しているようです。 NaNやInfinityのようなものは浮動小数点の典型です。 –
@DaveNewtonしかし、浮動小数点数の場合には例外はありませんが、なぜこの場合ですか? – ZX12R
浮動小数点演算を処理する場合は例外ではないため、明確な値(「無限大」または「NaN」)があります。 Geneのリンクからhttps://en.wikipedia.org/wiki/IEEE_floating_point#Exception_handlingを参照してください。 –