
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です。
No.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によるものなのか判断がつきません。
No.1
- 回答日時:
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;
}
とすることで例外を発生させる問題は回避できると思います。
実際の計算や値などは適宜追加してみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
main.c:7:43: warning: implici...
-
DWORDの実際の型は何でしょうか
-
ハンドルされていない例外が発...
-
構造体を引数とする、クラス間...
-
sshdログの意味
-
void func( void )について
-
【#define】 defineで定義した...
-
プログラムの中で別のmainを呼...
-
typedefの使い方
-
C++のコンストラクタを宣言する...
-
24ビットの変数
-
2重定義って??
-
C言語のコンパイルエラー
-
相互参照するクラス、俺こんな...
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
main.c:7:43: warning: implici...
-
long型の定数の末尾にLを付ける...
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
C++のfor文について
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
intとINTの違いは?
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
プログラムの中で別のmainを呼...
-
エラー「invalid conversion fr...
-
GCCで暗黙の型変換の警告を出し...
-
【#define】 defineで定義した...
-
sshdログの意味
-
DDVによるメッセージの変更
-
typedef enumの使い方を教えて...
-
構造体を生成時にわざわざ初期...
-
DLLでLIBファイルが作成されない
おすすめ情報