6

なぜ1/0 == Infすべての言語ではないのですか? それは数学的に最も正しい応答ではないでしょうか?

私がよく知っているすべての言語は、Infinite 値と NaN 値の両方を表現できるのに、なぜ代わりにエラーをスローしたり、NaN を返したりすることを選択するのでしょうか? 科学アプリケーション開発者の生活を困難にするだけですか? ;-)

更新:1f/0f == Float.NaN Java で間違って考えたので、この質問を閉じる必要があるかもしれません。しかし、私は間違ってました。正しく返されFloat.Infinityます。それが私の主な混乱でした。NaN を返す言語がない限り、一部の言語が代わりにエラーをスローするという事実は理解できます。

4

9 に答える 9

18

1 / 0 == inf が数学的に非常に疑わしいという事実は別として、ほとんどのプログラミング言語で機能しない単純な理由は、ほぼ普遍的に整数除算1 / 0を実行することです (例外が存在します)。

結果は整数であり、「無限大」を整数にエンコードする方法はまったくありません。浮動小数点数用があります。これが、浮動小数点除算が実際にほとんどの言語で無限値を生成する理由です。

同じことが NaN にも当てはまります。IEEE 浮動小数点標準では NaN 値を表すビット パターンが定義されていますが、整数にはそのような値はありません。したがって、そのような値は単純に整数として表すことはできません。

于 2011-07-03T15:48:24.917 に答える
3

nが(正の方向から)ゼロに近づくと、の限界は1 / n無限大に近づく傾向があります1 / 0 <> Infが、1/0が 未定義であるという理由(数学的な定義による!)。

于 2011-07-03T15:37:06.013 に答える
3

それは最も数学的に正しい応答ではありませんか?

いいえ、数学では、ゼロによる除算は単純に定義されておらず、無限大は一般に値ではありません(または単一の値ではありません)。

すべての言語/ライブラリがNaNを返すわけではない理由は、(a)ゼロ除算は、数学的に厳密なアルゴリズムではまったく発生しないため、プログラマーエラーの結果であることが多く、(b)プロセッサーは次のように処理する可能性があるためです。例外状態に変換するため、NaNに変換するにはそのような状態を処理する必要があります。つまり、除算は(たとえば、合計と比較して)以前よりもさらにコストがかかります。

于 2011-07-03T15:37:16.707 に答える
2

なぜトローリング?でも噛みます。これは、演算子を構築する方法によって異なる場合がありますが、除算を定義する最も一般的な方法は、乗算の逆関数です。つまり、c = a/b は、c が c*b = a となる一意の数として定義されます。

ここで、c = 1/0 を考えます。c*0 = 1 となる一意の c はありますか? 確かに R や C の範囲内ではありません。無限を導入するとどうなるでしょうか。0*Infinity = 1 という特殊なケースが考えられます。しかし、そうすると、乗算演算子の優れたプロパティが壊れてしまいます。つまり、2*(0*Infinity) = 2*1 = 2 が必要です。ただし、連想プロパティも必要です。したがって、(2*0)*無限大 = 0*無限大 = 1 です。

一般に、必要なプロパティを維持するために、Field を拡張して 0 の乗法逆数を持つことはできません。

とはいえ、トロールするためだけに古典的な 1/0 = 無限を導入したと思います。次の質問は、なぜ言語は 0.9 リピーターが 1 に等しくないことを認識しないのですか?

于 2011-07-03T17:08:40.553 に答える
1

どう0/0ですか-1/0?間違えたらどうしますか?プログラムのゼロ除算にInf結果を通知することはお勧めできません。

于 2011-07-03T15:37:44.373 に答える
1

Javaインタラクションペインに、これが表示されます。

Welcome to DrJava.  Working directory is /Users/morrison/Desktop/PhotoPuzzle
> int top = 1;
> int bottom = 0;
> top/bottom
java.lang.ArithmeticException: / by zero
> double topFloat = 1;
> double bottomFloat = 0;
> topFloat/bottomFloat
Infinity
> 

浮動小数点数は不正確であり、ゼロに非常に近くなる可能性があります。整数をゼロにすることは、おそらくプログラマーの間抜けと見なされます。これらは、おそらく2つの異なる動作です。

于 2011-07-03T15:39:57.160 に答える
1

浮動小数点演算は、いくつかの例外的な状態を検出し、いくつかの異なる方法で反応することができます。

  • 後でテストできるステータスフラグを設定します。
  • すぐにトラップを生成します。

最初のモードの操作では高性能が可能になり、2番目のモードでは誤った操作の可能性があることを即座に通知できます。

IEEE 754は、例外を発生させる操作の結果に対していくつかの正常な値を定義します(例:被除数の有限の非ゼロ数と除数のゼロ→正しく署名されたINFINITY; 0/0→静かなNaN)。

トラップに関するIEEE754の意図は、演算、オペランド(無効な演算およびゼロ除算例外の場合)または結果(オーバーフロー、アンダーフロー、および不正確な例外の場合)、および例外フラグを検査して例外フラグを返すことができるユーザーモードハンドラーが存在することです。新しいユーザー定義の結果。

実際には、一部の言語は、トラップハンドラーの設定は言うまでもなく、例外ステータスフラグへのアクセスもサポートしていません。

Cでさえトラップハンドラーの非常に原始的なサポートを提供しますが、C99はトラップモードを設定するための移植可能な方法を定義していません。たとえば、実装定義の値をに渡す必要がありますfesetenv()。実装は通常、SIGFPEを発生させ、ユーザーは通常、IEEE-754のようなトラップハンドラーを実装するためにCPU依存状態にアクセスする必要があります。

于 2011-07-03T17:22:57.233 に答える
0

場合によっては、または他の同様の値1 / 0として概算されることがあり ますが、正式にはそのように定義されていません。INF同じ前に10 / 0 < 20 / 0?または0 / 0

于 2011-07-03T15:38:48.367 に答える
0

除算a | b自体は定義されていませんb = 0。したがって、この操作の実装は、この概念を表現するために、このケースを特別な値にマップします。

于 2011-07-03T15:38:48.463 に答える