実数型変数の値が、実数か整数か区別するには?

解決


いな  2006-05-25 11:41:43  No: 61932  IP: 192.*.*.*

いつもお世話になってます。
WindowsXP/VC++6.0で開発しています。

double型の変数に格納されている値が
実数か整数かを判断するには、どのような方法がありますでしょうか。

double theVal = 1.2345 ←実数と判断したい。
double theVal = 1.0000 ←整数と判断したい。

宜しくお願いいたします。

編集 削除
YuO  2006-05-25 11:54:26  No: 61933  IP: 192.*.*.*

あまり正しいとは思いませんが……。

floor(theVal) == ceil(theVal)
という方法が使えるかもしれません。
# 床関数 == 天井関数であれば,小数部は存在しないはずなので。

編集 削除
いな  2006-05-25 13:15:33  No: 61934  IP: 192.*.*.*

>YuO様

回答有難うございます!
まったく思いつかなかった方法でした。
(というか、ceil関数の存在を知りませんでした)
試させて頂いたところ、小生が希望していた判断通りに動作致しました。

編集 削除
keichan  2006-05-25 16:25:23  No: 61935  IP: 192.*.*.*

double integer, decimal;
decimal = modf(theVal, &integer);
if( decimal == 0 )
    // 整数確定
else
    // 実数確定

でも可能ですね。

編集 削除
επιστημη  2006-05-25 16:26:47  No: 61936  IP: 192.*.*.*

…いいのかなそれで。
ある程度の幅を持たせないとマズいんちゃうか? と思えてならない。

編集 削除
nyangetsu  2006-05-25 16:57:48  No: 61937  IP: 192.*.*.*

επιστημηさんの言うとおりです。
整数かどうか判定する場合、どのくらいの誤差を許すのか明確にしておいた方が良いでしょう。
floor/ceil関数を利用しての判定は,実行結果が処理系によって変わってしまう危険性があると思われます。
keichanさんのコードを改造して

double integer, decimal;
decimal = modf(theVal, &integer);
if( fabs(decimal) <= 0.00001 )  //実際は許容誤差の値は定数を定義しておいた方がいいでしょう
    // 整数確定
else
    // 実数確定

のようにするのが良心的だと思うのですがどうでしょうか。

編集 削除
keichan  2006-05-25 17:28:52  No: 61938  IP: 192.*.*.*

nyangetsuさん、フォローありがとうございます。
もちろん誤差の部分は必要ですが、簡略な説明のために省きました。

編集 削除