• ベストアンサー

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となります。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

多分、実数の誤差に起因する問題でしょう。変数のウォッチ(VC を使ってる?)では なく、問題の箇所の直前に、以下のような文を追加して、変数の内容を確認してみて下さい。 printf("tmp = %40.30f, tmp1 = %40.30f\n", tmp, tmp1); 多分、内容が違っているはず。 質問にある「 x に -1000 が入ってきたとき」というのは、直接 x に -1000 を代入 したのではなく、float の変数を使った演算の結果だったりしませんか?

youking
質問者

お礼

すいません、僕の勘違いでした。 やはりa-kumaさんがいっていた通り tmp1 999.999999999999999999でした。 デバッグウィンドウでは 1000.00000000000000 なのに なぜにprintfではしっかり出るのでしょうか?

youking
質問者

補足

tmp = 1000.000000000000000000000000000000, tmp1 = 1000.000000000000000000000000000000 となっています。 ちなみに_chgsign(tmp) もやってみましたが一緒でした。 ふぅ・・本当に何が原因なんでしょうか。

その他の回答 (3)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

tmpとtmp1をそれぞれ小数点以下20桁くらいまで表示してみて下さい。 何か分かるかも。

youking
質問者

お礼

すいません、僕の勘違いでした。 ranxさんの言うとおりでした。

youking
質問者

補足

20桁以上表示しても同じでした。

noname#26283
noname#26283
回答No.2

 時間があれば、変数をdoubleからintに変更してみてください。  もし同じ不具合が起こらなくなったら、計算機内部で小数を保持する形式に起因する問題だと思います。(詳しいことは…わかりません。すみません)  もし同じ状況なら…わかりません。(ほんとにすみません)

youking
質問者

補足

int test1 = (int)tmp; int test2 = (int)tmp1; if(test1 >= test2) A; else B; デバッグウィンドウでは test1 1000 test2 1000 となっているのに Bが実行されてしまいます。 -1000を1000に変換する方法がいけないのでしょうか?

回答No.1

> if(tmp >= tmp1){//ここで問題が発生 >= でなく、=>では? コンパイラが何かはわかりませんが、シンタックスエラーは出なかったのでしょうか?

youking
質問者

補足

=>っていう演算子ってないような気がするのですが・・ ちなみにVC++です。 エラーは一切出ていないです。

関連するQ&A