アプリ版:「スタンプのみでお礼する」機能のリリースについて

初歩的な質問ですいません。

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 回答 (4件)

多分、実数の誤差に起因する問題でしょう。

変数のウォッチ(VC を使ってる?)では
なく、問題の箇所の直前に、以下のような文を追加して、変数の内容を確認してみて下さい。

printf("tmp = %40.30f, tmp1 = %40.30f\n", tmp, tmp1);


多分、内容が違っているはず。

質問にある「 x に -1000 が入ってきたとき」というのは、直接 x に -1000 を代入
したのではなく、float の変数を使った演算の結果だったりしませんか?

この回答への補足

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

補足日時:2002/08/12 16:57
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/08/12 17:04

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


何か分かるかも。

この回答への補足

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

補足日時:2002/08/12 17:00
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/08/12 17:05

 時間があれば、変数をdoubleからintに変更してみてください。


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

この回答への補足

int test1 = (int)tmp;
int test2 = (int)tmp1;
if(test1 >= test2)
A;
else
B;

デバッグウィンドウでは
test1 1000
test2 1000
となっているのに
Bが実行されてしまいます。
-1000を1000に変換する方法がいけないのでしょうか?

補足日時:2002/08/12 16:44
    • good
    • 0

> if(tmp >= tmp1){//ここで問題が発生



>= でなく、=>では?
コンパイラが何かはわかりませんが、シンタックスエラーは出なかったのでしょうか?

この回答への補足

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

補足日時:2002/08/12 16:39
    • good
    • 0

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