2017-04-18 8 views
-1

対ダブルでループ。私はそれがダブルスとintsのループで何かを持っていると思うが、私はよくわからない。は私が一見似たループ用の2つの異なる出力を取得する理由を把握しようとしていますint型

このコード出力4:

Current Cost: 1 
Remaining: 9 
Current Cost: 2 
Remaining: 7 
Current Cost: 3 
Remaining: 4 
Current Cost: 4 
Remaining: 0 
4 candies; 0 left over 

このコード出力3:

double num = 1.0; 
double cost; 
int counter = 0; 

for(cost = 0.1; cost <= num; cost += .1) { 
    counter +=1; 
    num -= cost; 
} 

cout << counter << endl; 

編集:

これをこれは、このセクションの出力である

int num = 10; 
int cost; 
int counter = 0; 

for (cost = 1; cost <= num; cost += 1){ 
    counter += 1; 
    num -= cost; 
} 

cout << counter << endl; 

thの出力ですデバッグしようとしたときのコードです:

Current Cost: 0.1 
    Remaining: 0.9 
    Current Cost: 0.2 
    Remaining: 0.7 
    Current Cost: 0.3 
    Remaining: 0.4   
    3 candies; 0.400000 left over 

なぜ2つの違いがありますか?

+3

デバッガでそれをフォローするか、各変数の値はいつでも –

+0

にあるものを見ることができるようにループ内で出力文を入れて[注意してください。 'double'はあいまいすることができます。](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – user4581301

+0

@MM私はすでに、まだ理由である、問題を導き出すことができなかったこと私はここでIより良いことを知っている人の助けを求めるために来た。 – Biggytiny

答えて

2

私はおそらくこれを行うべきではありませんが、私はあなたのコードをデバッグして、二重ループが第四の反復で失敗します。

どちらNUM0.4の値をとるコスト、しかし:

cost <= num; 

はfalseと評価。 これは、倍精度の性質が非常に正確に格納されているためです。 ダブルスを扱うときは、==、> =および< =を避けることをお勧めします。 ソリューションにあなたのループを変換するために、次のようになりますので、精度の問題を解決する

for(cost = 0.1; cost < num+0.001; cost += .1) { 
    counter +=1; 
    num -= cost; 
} 

が、それは、より複雑な環境での問題につながる可能性があるので、私はに対してそれををお勧めします。

+0

これは私が探していた答えであり、私がここに来る前に行ったコードをデバッグするように言ってくれてありがとうございます。とても有難い。 – Biggytiny

+0

'cost'と' num' **の両方は、バイナリ浮動小数点にそのような値がないため、値をとることはできません(10進浮動小数点を使用する奇妙なコンパイラを使用していない限り)。彼らはちょうど最も近い価値を取ることができます。それでも[あなたの提案された方法は浮動小数点比較のための良い方法ではありません](http://stackoverflow.com/q/17333/995714)http://floating-point-gui.de/errors/comparison/ –

関連する問題