• ベストアンサー

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

  • 単体テストのやり方

    単体テストってどうやってするのですか?教えてください。 例えば、この関数だったらどういうテストコードを書けばいいですか? bool isStart(char c){ if(c == 'Y'){ return true; } else if(c == 'N'){ return false; } }

  • BOOLに変わるもの

    コンパイラーによってBOOLは古い?とエラーになります。TRUEかFALSEの1ビットしかいらないのに、INTやCHARを使うのでしょうか?BOOLに変わる新しい?宣言ってあるのでしょうか?

  • 【ExcelVBA】IF条件を満たしているのに、IF条件のところで止まってしまう

    Sub test1() 変数1 = IsEmpty(Range("C1")) If Range("A1") > 0 And Range("B1") = 0 And 変数1 = True Then   test2 End If End Sub 止まったときのデバッグでの表示は Range("A1")は「100」(セルの中身) Range("B1")は「0」(セルの中身) 変数1はRange("C1")がエラー表示なので「True」 すべての条件を満たしているのですが、 IF条件のところで止まってしまいます。 (IF条件のところの1行が黄色くハイライトになっている状態) 止まったデバッグの後に、F5を押して実行させると、 IF条件の続きから実行されて、test2が実行されて処理が終了します。 何で、IF文のところで一度止まってしまうのかわかりません。

  • pythonコードについて

    以下のpythonコードに関して質問があります。なぜ一度Falseになったatsplitがforループ内で再びTrueになるのでしょうか?以下にコードと結果を掲載しております。 def split_string(source,splitlist): output = [] atsplit = True for char in source:    if char in splitlist:      atsplit = True      print atsplit    else:       if atsplit:          output.append(char)          atsplit = False          print atsplit       else:          output[-1] = char return output out = split_string("This is a test-of the,string separation-code!"," ,!-") print out #>>> ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code'] False True False True False True False True False True False True False True False True False True ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code']tsplit = True

  • VC++でのメールの添付ファイル受信

    http://www.masukawa.co.jp/sdk/40.html のサイトを参考にしてソースを組んでいます。 ですが BOOL Pop3RecvDataToFile(SOCKET sock, int i, char *filename) { char *get, tmp, buff[BUFF_SIZE]; int size, pos; FILE *fp; if (!SockCmd1(sock, "RETR %d", i, buff, "+OK")) return FALSE; if ((fp = fopen(filename, "wb")) == NULL) return FALSE; tmp = '\0'; pos = 0; for (;;) { size = recv(sock, buff, BUFF_SIZE, 0); for (get=buff; get<(buff+size); get++) { if (*get=='\0' || *get=='\r') continue; if (++pos == 1) { if (*get != '\n') { tmp = *get; continue; } } else if (pos == 2) { if (tmp=='.' && *get=='\n') goto FINISH; if (tmp!='.' || *get!='.') fputc(tmp, fp); } fputc(*get, fp); if (*get == '\n') pos = 0; } } FINISH: fclose(fp); return TRUE; } のfor分で無限ループしています。 その理由がわかりません。どうすればよいでしょうか?

  • Javaのif文がわかりません!

    public class If2 {   static boolean b1, b2;   public static void main(String[] args) {     int x = 0;     if ( !b1 ) {     if ( !b2 ) {       b1 = true;       x++;       if ( 5 > 6) {         x++;       }       if ( !b1 ) x = x + 10;       else if ( b2 = true ) x = x + 100;       else if ( b1 | b2 ) x = x + 1000;       }     }     System.out.println(x);    }  } ------------------------------------------------------------ 正常にコンパイルされ、101とでます。 if文の()内にある!b1というのが意味が分かりません^^; 2行目でb1とb2はfalseになるのは分かりましたが !b1や!b2はfalseではない!ということですか? 誰か教えてください!よろしくお願いします!!

  • IF文で空白セル

    勘違いしているのかもしれませんが、 エクセルの数式IF文で、TRUEの時に空白(?)を入力するにはどうしたらよいのでしょうか? 今までは、TRUEのところに "" とダブルクオーテーション二つを入力していたのですが、IF文が入っているセル(TRUE)をISBLANKで参照するとFALSEとなります。 ISBLANKで参照したときに、TRUEとするためには、IF文にどういう風に入力すればよいのでしょうか? うまく説明できませんが、ご教授お願いします。

  • MATLABでの、1行完結のIF文の書き方について教えてください。

    MATLABでの、1行完結のIF文の書き方について教えてください。 if (i==1);data(~test1 | test2>10) = -9; end の一文で、iが "8" になったときにのみ、ここでエラーが発生してしまいます。 この文の意味は 「test1ではない または test2が10より大きい 場合、dataに-9を代入する」 だと理解しています。 test1は、test1=(test0<100); という一文の結果が入っています。実際には test1 ===> 100*100 logical (100より大きいので、FALSE) test2 ===> 200*200 double が入ります。 if (i==1);data(test0>100 | test2>10) = -9; end と書き直して、両方 double にしてもやはりエラーになりました。 条件を複数記述する書き方が間違っているのでしょうか。 いろいろ試したもののうまくいかず困っています。 アドバイスをいただけましたら助かります。 宜しくお願い致します。

  • クラスや構造体のarrayを作りたい。

    クラスや構造体のarrayを作りたい。 クラスや構造体のarrayを作りたいのですが、 以下の方法で正しいのでしょうか? ==================================== #include <string> #include <vector> class Test{ public:   std::string sono1;   int sono2;   bool sono3;   //コンストラクタ   Test(std::string tmp_sono1,int tmp_sono2,bool tmp_sono3){     sono1=tmp_sono1;     sono2=tmp_sono2;     sono3=tmp_sono3;   } }; void main(){   std::vector<Test> testObjArray;   testObjArray.push_back(*(new Test("てすと1",1,true)));   testObjArray.push_back(*(new Test("てすと2",2,false))); } ==================================== 質問1: コンストラクタ時、クラス内の変数へ引数の値を渡す時、 上記のようにtmpを作成する以外の方法はありますか? 質問2: push_back時、クラスをインスタンスしてvectorに渡すにはこのような記述であってるのでしょうか? 「testObjArray.push_back(*(new Test("てすと1",1,true)));」 一応問題なく動いているようなのですが心配です。 よろしくお願いします。

  • ダブルポインタ?

    下記のような関数が存在し、 最終的には mainで宣言した変数 "a" にDataGetでコピーしたデータを mainで再び使用したいのですが、 下記の方法だとmainに何も帰ってきません。 (NULLのまま・・・) 下記の関数を使用しmainに上手くデータを 引き継ぐためにはどうすれば良いのでしょうか? void Mem(int nSize,void **ptr){ char *tmp; tmp = malloc(nSize); *ptr = tmp; } void DataGet(char *aa,char *a){ int nSize = 5; (void)Mem(nSize,(void **)&a); memcpy(a,aa,nSize); return; } void main(){ char aa[20]; char *a = 0x00; memset(aa,0x00,20); memcpy(aa,"test",4); (void)DataGet(aa,a); /* aデータをここから再び使いたい */ }

専門家に質問してみよう