プロが教えるわが家の防犯対策術!

0除算とは例えば10を0で割ったら結果が無限大になるように、ある数を0で割った時に起こる現象です。

しばしばこの0除算に悩まされるので、ある式を代入したらそれが0除算であるかどうかを判定できたらと思いました。
そこで下のような関数を作れたらと思っているのですが、
ある式を見てその結果が0除算であるかを判定する方法はありますでしょうか?

int isDivide0( float val )
{
  if ( val == 0除算 )
    return 1;
  else
    return 0;
}

int main()
{
  isDivide0( 10 / 0 );
}

尚、開発環境はVisual Studio2005です。

A 回答 (2件)

C++でよければ、



class divide_by_zero : public std::domain_error { ... };

template <typename T>
class arithmetic
{
 T value_;
public:
 ...
 template <typename U>
  T operator/(U rhs) const
 {
  if (rhs == U(0)) throw divide_by_zero();
  return value_ / rhs;  
 }
 ...
};

のようにするのが一番確実です。
すでに除算(または剰余算)が行われた後だと、未定義の動作になってしまうので一般的な対策は困難です。

VC++に限れば、無限大かどうかを判断する方法もありますが、それがゼロ除算によるものなのか、オーバーフローの結果やHUGE_VALによるものなのか判断がつきません。
    • good
    • 0
この回答へのお礼

なるほど・・やはり私がやりたいことはちょっと難しいのかなと思いました。
回答ありがとうございました。

お礼日時:2008/06/06 17:45

Visual Studioでやったことはないので確定的な発言はできないのですが、0除算って言語仕様としては「無限」ではなく「不定」なので禁止事項なので、上記のプログラミングですとコンパイルの時点(オプションレベルにもよりますが)で0除算のエラーが出るかと思います。


仮に実行できたとしても例外が発生しメモリの内容を壊してしまいます。

回避策としては、
int isDevide0(float val)
{
if(val==0) {
return TRUE;
} else {
return FALSE;
}
}

int main()
{
int ret_sts;
val1 = 10; /* 割る数 */
val2 = 0; /* 割られる数 */

ret_sts = isDevide0( val2 ):
 return ret_sts;
}

とすることで例外を発生させる問題は回避できると思います。
実際の計算や値などは適宜追加してみてください。
    • good
    • 0
この回答へのお礼

なるほど。不定とみなされていたんですね。回答ありがとうございました。

お礼日時:2008/06/06 17:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!