DOBON.NET DOBON.NETプログラミング掲示板過去ログ

「0で除算」の例外処理のスロー

環境/言語:[XP/VB.NET/Framework1.1]
分類:[.NET]

以下のような計算式で「0で除算」を判断したいのですが
実行すると例外(実行時エラー)にならないのでキャッチできません
なにか良い方法ないでしょうか?

Dim d As Double
d = 100 / 0

結果(d)は、1.#INF(無限大)となる
また、変数dを無限大かどうかなど、判断する方法はないですか?
■No11660に返信(マーシャリンガーさんの記事)
> d = 100 / 0

いや、割る側がゼロかどうかを判断するだけだと思うんですがw
■No11660に返信(マーシャリンガーさんの記事)
> 結果(d)は、1.#INF(無限大)となる
> また、変数dを無限大かどうかなど、判断する方法はないですか?

Double.IsInfinity(d)
> いや、割る側がゼロかどうかを判断するだけだと思うんですがw

そう言われれば、それまでですが、VB6では実行時エラーになっていたので
VB.NETに移行前のソースがOn Error GOTO * で処理して
動作が変わってしまったので...
また、計算式がたくさんあるので安直にエラーになってくれないかと思ったのです。

> Double.IsInfinity(d)
あっ、これ使えます!ありがとうございます。
もう少し、調べてみます。
こんにちは、じゃんぬ です。

■No11665に返信(マーシャリンガーさんの記事)
> あっ、これ使えます!ありがとうございます。
> もう少し、調べてみます。

ついでに、こちらの「0 による除算」をお読みになってください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vaconarithmeticoperators.asp

例外として扱いたければ、割る側が ZERO かどうかを判断して、
DivideByZeroException を Throw するようなメソッドを作りましょう。
> 以下のような計算式で「0で除算」を判断したいのですが
> 実行すると例外(実行時エラー)にならないのでキャッチできません

エラーにするのが目的ならば、「浮動小数点型を使うのを止める」という手も。

Dim A As Decimal = 100
Dim B As Decimal = 0
Dim C As Decimal = A / B
■No11667に返信(じゃんぬねっとさんの記事)
> ついでに、こちらの「0 による除算」をお読みになってください。
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vaconarithmeticoperators.asp
 参考にさせてもらいます。
「浮動小数点値を 0 で除算すると、IEEE 754 の算術規則に従って、結果の値は、正の無限大、負の無限大、または非数 (NaN) のいずれかになります。」
ということが、わかりました。0/0のときは、Double.IsNaNで判断できそうです。
0で除算するとどうなるかということが理解できました。
ありがとうございます。

> 例外として扱いたければ、割る側が ZERO かどうかを判断して、
> DivideByZeroException を Throw するようなメソッドを作りましょう。
可能な限り、割る側が ZERO かどうかを判断してその上でIsNaN、IsInfinityを使うことにします。
解決済み!
■No11668に返信(魔界の仮面弁士さんの記事)
> エラーにするのが目的ならば、「浮動小数点型を使うのを止める」という手も。
>
> Dim A As Decimal = 100
> Dim B As Decimal = 0
> Dim C As Decimal = A / B
なるほど、この手も使えますね。参考にします。
  • 題名: Re[1]: 「0で除算」の例外処理のスロー
  • 著者: マーシャリンガー
  • 日時: 2005/07/07 14:15:50
  • ID: 11671
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No11660に返信(マーシャリンガーさんの記事)
「解決済み」と表示されなかったので再度解決マークをチェックしました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板