- ベストアンサー
if((double)a >= (double)b))
初歩的な質問ですいません。 SetTani(char* text, double x) { BOOL test = FALSE; double tmp = x; double tmp1 = 1000.000; if(x < 0){//もしもマイナスだったらプラスにする tmp = fabs(tmp); test = TRUE; } if(tmp >= tmp1){//ここで問題が発生 ・ ・ ・ } xに-1000が入ってきた時に問題が発生します。 絶対値を求めたあとのif文ではじかれてしまいます。 デバッグモードでみてみても tmp 1000.000000 tmp1 1000.000000 となっているのになぜ if(tmp >= tmp1) がTRUEとならないのでしょうか? ちなみにxに1000が入ってきたときは tmp 1000.000000 tmp1 1000.000000 となっていて if(tmp >= tmp1)がTRUEとなります。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
多分、実数の誤差に起因する問題でしょう。変数のウォッチ(VC を使ってる?)では なく、問題の箇所の直前に、以下のような文を追加して、変数の内容を確認してみて下さい。 printf("tmp = %40.30f, tmp1 = %40.30f\n", tmp, tmp1); 多分、内容が違っているはず。 質問にある「 x に -1000 が入ってきたとき」というのは、直接 x に -1000 を代入 したのではなく、float の変数を使った演算の結果だったりしませんか?
その他の回答 (3)
- ranx
- ベストアンサー率24% (357/1463)
tmpとtmp1をそれぞれ小数点以下20桁くらいまで表示してみて下さい。 何か分かるかも。
お礼
すいません、僕の勘違いでした。 ranxさんの言うとおりでした。
補足
20桁以上表示しても同じでした。
時間があれば、変数をdoubleからintに変更してみてください。 もし同じ不具合が起こらなくなったら、計算機内部で小数を保持する形式に起因する問題だと思います。(詳しいことは…わかりません。すみません) もし同じ状況なら…わかりません。(ほんとにすみません)
補足
int test1 = (int)tmp; int test2 = (int)tmp1; if(test1 >= test2) A; else B; デバッグウィンドウでは test1 1000 test2 1000 となっているのに Bが実行されてしまいます。 -1000を1000に変換する方法がいけないのでしょうか?
- kani-tama
- ベストアンサー率33% (2/6)
> if(tmp >= tmp1){//ここで問題が発生 >= でなく、=>では? コンパイラが何かはわかりませんが、シンタックスエラーは出なかったのでしょうか?
補足
=>っていう演算子ってないような気がするのですが・・ ちなみにVC++です。 エラーは一切出ていないです。
お礼
すいません、僕の勘違いでした。 やはりa-kumaさんがいっていた通り tmp1 999.999999999999999999でした。 デバッグウィンドウでは 1000.00000000000000 なのに なぜにprintfではしっかり出るのでしょうか?
補足
tmp = 1000.000000000000000000000000000000, tmp1 = 1000.000000000000000000000000000000 となっています。 ちなみに_chgsign(tmp) もやってみましたが一緒でした。 ふぅ・・本当に何が原因なんでしょうか。