下記のようにある値の差が0になったらループを抜ける処理をしているのですが
差が0のときも抜けることができません。
どこかおかしいでしょうか?
ご教授くださいませ。
if( kausuu > 1) {
RATE[kaisuu]=(double)Atai[kaisuu]-(double)Atai[kaisuu-1];
if(RATE[kaisuu] ==(double)0)
{
break;
}
}
ちょっとインデントが変なのでそれだけ直したが
if( kausuu > 1) { // kausuuでいい
のかkaisuuじゃないのか?
RATE[kaisuu]=(double)Atai[kaisuu]-(double)Atai[kaisuu-1]; // キ
ャストしなくても最初からdoubleにすれば?
if(RATE[kaisuu] ==(double)0)
{
break;
}
}
なぜdoubleにしてるのかわからないんだが・・・intまたはlongでいいんじゃないのか?
少数を扱う意味があるのか?
RATE, Atariも配列になってるけど何故だ?中身はどこで代入してるんだ?
そもそもループはどこにある?
なにをやりたいのかさっぱりわからないのでそこから書いてもらえないだろうか
if( kausuu > 1) { // kausuuでいいのかkaisuuじゃないのか?
RATE[kaisuu]=(double)Atai[kaisuu]-(double)Atai[kaisuu-1];
// ↑キャストしなくても最初からdoubleにすれば?
if(RATE[kaisuu] ==(double)0)
{
break;
}
}
変なところで改行が入ってしまった・・・すまん
if(RATE[kaisuu] ==(double)0)
{
break;
}
の所は、
”RATE[kaisuu](64bit浮動小数点)の仮数部が全部0の時だけbreakしなさい”
という記述だと思います。
RATE[kaisuu]=(double)Atai[kaisuu]-(double)Atai[kaisuu-1];
のように記述されていますが、おそらく浮動小数点の誤差でRATE[kaisuu]が
期待通りに0.0になっていないのだと思います。
浮動小数点でこのような比較をする場合には、許容誤差として
double fDelta = 0.1e-12; //許容誤差
などのようにして、
if(fabs(RATE[kaisuu])<fDelta)
{
break;
}
とするのが良いかと思います。
>RATE[kaisuu]=(double)Atai[kaisuu]-(double)Atai[kaisuu-1];
希望の値にならない理由は分かりますか、ステップ実行でデバックできますか
> if(RATE[kaisuu] ==(double)0)
「(double)0」はなんのためのキャストでしょうか?
変数に入っている実際の値を示してみてくれませんか
if直前の
RATE[kaisuu]
Atai[kaisuu]
Atai[kaisuu-1]
それぞれのあたい
ご本人がループと書いているのだから外側にループがあるんだと思いますが、
途中を省略してもループが一見して分かるようにコードの提示をしてほしいですね。
質問している方は自分のコードだから分かるのでしょうが、
レスを付け入る方はコード全体を把握していないので混乱を招くと思いますよ。
woodさんの
>「(double)0」はなんのためのキャストでしょうか?
には賛成。
単に0.0と書けば済むと思いますし。
その他は他の方のアドバイスで十分かな。
まさかと思いますが、抜けるべきループとbreakしている場所が違うところなんて
落ちは無いですよね。
皆さん
返事遅れまして申し訳ないです。
あの後、自分でも調べていましてゴッホさんにも指摘していただいたような
許容誤差の問題でした。
「(double)0」のキャストは紛らわしくて申し訳ないです。
意味の無いことでした。
>ステップ実行でデバックできますか
有難うございました。とても参考になります。
皆様、本当に有難うございました。