- ベストアンサー
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となります。 よろしくお願いします。
- youking
- お礼率48% (95/194)
- C・C++・C#
- 回答数4
- ありがとう数2
- みんなの回答 (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++です。 エラーは一切出ていないです。
関連するQ&A
- BOOLに変わるもの
コンパイラーによってBOOLは古い?とエラーになります。TRUEかFALSEの1ビットしかいらないのに、INTやCHARを使うのでしょうか?BOOLに変わる新しい?宣言ってあるのでしょうか?
- ベストアンサー
- C・C++・C#
- 【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分で無限ループしています。 その理由がわかりません。どうすればよいでしょうか?
- 締切済み
- C・C++・C#
- 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ではない!ということですか? 誰か教えてください!よろしくお願いします!!
- 締切済み
- Java
- 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)));」 一応問題なく動いているようなのですが心配です。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ダブルポインタ?
下記のような関数が存在し、 最終的には 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データをここから再び使いたい */ }
- ベストアンサー
- C・C++・C#
お礼
すいません、僕の勘違いでした。 やはりa-kumaさんがいっていた通り tmp1 999.999999999999999999でした。 デバッグウィンドウでは 1000.00000000000000 なのに なぜにprintfではしっかり出るのでしょうか?
補足
tmp = 1000.000000000000000000000000000000, tmp1 = 1000.000000000000000000000000000000 となっています。 ちなみに_chgsign(tmp) もやってみましたが一緒でした。 ふぅ・・本当に何が原因なんでしょうか。