2

次のコード行を実行すると、DIVIDE BY ZEROエラーが発生します

1. System.out.println(5/0);

これは予想される動作です。

今、私は以下のコード行を実行します

2. System.out.println(5/0F);

ここにはDIVIDE BY ZEROエラーはありませんが、表示されますINFINITY

最初の行では 2 つの整数を割り、次の行では 2 つの実数を割ります。

DIVIDE BY ZERO整数をゼロで割るとエラーが発生するのに、実数の場合はなぜエラーが発生するのですか?INFINITY

プログラミング言語に固有のものではないと確信しています。

4

2 に答える 2

5

(編集:質問が少し変更されました-ある時点で特にJavaに言及していました。)

Java の整数型には、無限大や「数値ではない」値などの表現がありません、IEEE-754 の浮動小数点型にはや がfloatありdoubleます。それは本当にそれと同じくらい簡単です。実際には「実数」と「整数」の違いではありません。たとえば、BigDecimal実数も表しますが、無限大の表現もありません。

編集:明確にするために、これ言語/プラットフォーム固有のものであり、異なる動作をする独自の言語/プラットフォームを作成できます。ただし、基盤となる CPU は通常同じように動作するため、非常に多くの言語がこのように動作することがわかります。

編集:動機に関しては、特に無限大の場合、非常に小さな浮動小数点数で割るなど、ゼロで除算せずに無限大に到達する方法があることに注意してください。整数の場合、明らかに 0 と 1 の間には何もありません。

floatまた、整数 (または10 進浮動小数点型) が使用される場合は、通常、無限大の概念を必要としない、または「数ではない」という結果になることにも注意しdoubleてください。 「無限大」(または少なくとも「大きすぎて適切に表現できない数」) は、依然として有効な結果である可能性があります。

于 2012-01-28T09:12:08.083 に答える
0

これ、1 つのプログラミング言語または言語ファミリーに固有のものです。すべての言語で整数と浮動小数点数を同じ式で使用できるわけではありません。すべての言語に両方の型があるわけではありません (たとえば、JavaScript のような ECMAScript 実装には、外部的に整数型の概念がありません)。すべての言語に、値をインラインで変換するためのこのような構文があるわけではありません。

ただし、整数演算浮動小数点演算には本質的な違いがあります。整数演算では、結果を表す値がないため、ゼロによる除算はエラーであることを定義する必要があります。浮動小数点演算、特に IEEE-754 で定義されている演算では、無限の数学的概念と NaN (数値ではない) のようなメタ概念のための追加の値 (符号ビット、指数、および仮数の組み合わせ) があります。

したがって/、このプログラミング言語の演算子は一般的であり、両方のオペランドが言語の整数型である場合に整数除算を実行すると想定できます。また、オペランドの少なくとも 1 つが言語の float 型である場合は浮動小数点除算を実行しますが、他のオペランドは演算の目的でその float 型に暗黙的に変換されます。

実数演算では、数値をゼロに近い数値で除算することは、絶対値が非常に大きい数値 (x / (1 / y) = x * y) を最初の数値に掛けることと同じです。したがって、浮動小数点値の精度を超えるため、ゼロ除算の結果が無限大 (として定義される) であることは合理的です。

実装の詳細は、そのプログラミング言語の仕様に記載されています。

于 2012-01-28T09:51:45.033 に答える