6

Scala では、ゼロによる整数算術 div は をスローしますがjava.lang.ArithmeticException: / by zero、浮動小数点算術 ( 1.0/0.0) は を返しますDouble.Infinity

型の観点からすると、Double.Infinity と Integer.Infinity の両方を持つのは難しいかもしれないことは理解していますが、scala の強力な型システムを使用すれば、問題のその側面を解決する別の方法を見つけることができたと思います。

これらの2つの異なる動作をよりよく説明するために私が見逃しているものは他にありますか?

4

1 に答える 1

15

これはソフトウェアの制限ではなくハードウェアの制限であり、理由は単純です。IEEE754浮動小数点演算は明示的にとをサポート+Infします-Inf。つまり、これら2つのアイデアに対応するビット表現があるため、の結果であることが理にかなっています1.0/0.0

一般的なプロセッサに実装されている整数演算には、無限大の内部表現がないため、エラーをスローする必要があります。

divソフトウェアで無限大をサポートする積分型を実装することもできますが、除算演算がプロセッサの命令に直接対応しないため、処理が遅くなります。私の意見では、これは賢明ではありません。整数のdiv-by-zeroエラーは、ほとんどの場合、(a)アルゴリズムの誤った実装、または(b)ユーザー入力の検証の失敗が原因であり、どちらも対処しなければならない基本的な問題です。実行時に例外を介してではなく、コードをコンパイルする前に!一方、FP演算では、期待しない(そして実際にはできない)ときに、ゼロによるdivに簡単に遭遇する可能性があります。1e-308/1e+308正しい値を持っていdoubleますが、両方のオペランドがそうである場合でも、として表現できません。

于 2013-02-20T22:04:18.553 に答える