VB.NET での NaN、無限大、ゼロ除算
プログラミング入門書には通常、次の警告が含まれています。実行時エラーが発生します!」
物事は変わった VB.NET .もっとありますが プログラミング オプションと計算はより正確ですが、物事がそのように起こる理由を理解するのは必ずしも容易ではありません。
ここでは、VB.NET の構造化エラー処理を使用してゼロ除算を処理する方法を学習します。また、新しい VB.NET 定数である NaN、Infinity、および Epsilon についても説明します。
VB.NET で「ゼロ除算」を実行するとどうなるか
VB.NET で「ゼロ除算」シナリオを実行すると、次の結果が得られます。
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
それで、ここで何が起こっているのですか?答えは、VB.NET が実際に数学的に正しい答えを与えるということです。数学的に、あなたは できる ゼロで割りますが、得られるのは「無限大」です。
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
値「無限」は、ほとんどのビジネス アプリケーションではあまり役に立ちません。 (ただし、CEO が株式ボーナスの上限を知りたがっている場合を除きます。) ただし、それほど強力でない言語の場合のように、実行時例外でアプリケーションがクラッシュすることはありません。
VB.NET は、計算を実行できるようにすることで、さらに柔軟性を高めます。これをチェックしてください:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
数学的に正しいままにするために、VB.NET は 0 / 0 などの一部の計算に対して NaN (非数) を返します。
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
VB.NET は、正の無限大と負の無限大の違いも識別できます。
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
PositiveInfinity と NegativeInfinity に加えて、VB.NET は Epsilon も提供します。これはゼロより大きい正の Double 値の最小値です。
VB.NET のこれらの新機能はすべて、浮動小数点 (Double または Single) データ型でのみ使用できることに注意してください。また、この柔軟性により、Try-Catch-Finally (構造化されたエラー処理) の混乱が生じる可能性があります。たとえば、上記の .NET コードは、いかなる種類の例外もスローせずに実行されるため、Try-Catch-Finally ブロック内にコーディングしても役に立ちません。ゼロ除算をテストするには、次のようなテストをコーディングする必要があります。
|_+_||_+_|
(Single または Double 型の代わりに Integer を使用して) プログラムをコーディングしても、「ゼロ除算」例外ではなく「オーバーフロー」例外が発生します。 Web で他のテクニカル ヘルプを検索すると、すべての例で OverflowException がテストされていることがわかります。
.NET には、実際には正当な型として DivideByZeroException があります。しかし、コードが例外をトリガーしない場合、いつこのとらえどころのないエラーが表示されるのでしょうか?
DivideByZeroException が表示される場合
それが判明したとして、 マイクロソフト Try-Catch-Finally ブロックに関する MSDN ページでは、実際にはゼロ除算の例を使用して、それらのコーディング方法を示しています。しかし、彼らが説明していない微妙な「キャッチ」があります。彼らのコードは次のようになります。
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
このコード する 実際のゼロ除算例外をトリガーします。
しかし、なぜこのコードは例外をトリガーし、以前にコード化したものは何もトリガーしないのでしょうか? Microsoft が説明していないことは何ですか?
彼らが使用する操作は いいえ 除算 ('/')、整数除算 ('') です! (他の Microsoft の例では、実際に変数を Integer として宣言しています。) 結局のところ、整数計算は それだけ 実際にその例外をスローするケース。 Microsoft (および Microsoft のコードをコピーした他のページ) がその詳細を説明してくれたらよかったのに。