2016-09-19 6 views
1

なぜprint(1.0/0)が返されるinfprint(0.0/0)がNaNを返し、print(0/0)がコンパイル時に失敗するのですか?Swiftの除算のコンパイル時間チェック

Swiftは整数を0で割って浮動小数点数を除いてコンパイル時間チェックを行っているようですが、

誰にもこのような理由が説明できますか?

答えて

2

浮動小数点数とその算術演算のIEEE 754規格では、有効値として "無限大"と "非数"が定義されています。彼らは数学的に有用な意味で "有効"ではないかもしれませんが、標準が定義しているものです。浮動小数点数で動作するコードは、特定の演算の値をと予測し、必要に応じてその値を確認/応答できるため、SwiftはFP演算の標準を尊重します。

対応する言語間の、CPUに依存しない整数演算の標準はありません。 Swiftの外では、整数をゼロで割ることは、プログラムを停止するか間違った結果を生成するかどうかを必ずしも知らないので、一般的にはBad Thingと仮定しています。

Swiftのデフォルトの動作は、すべての整数演算に対して「安全」であるため、タイプの境界をオーバーフローさせる操作は実行時例外になります。 (すなわち、ゼロによる除算を含む。)スウィフトはコンパイル時定数に算術演算を実行するため

リテラルコードで0/0

を入れ、あなたが コンパイル時エラーを取得します。 ( let x = 1 + 2のようなコードがある場合は、実行時に 3の結果を計算するのは意味がありません。なぜなら、プログラムのすべての実行で一定であるからです。

関連する問題