2011-06-23 9 views
0

私はC++で非常に奇妙なエラーがあります。 maxとsingleStepの2つの値があります。あなたはこのような出力が期待できるC++(int)staticキャスト奇妙なエラー

max = 100; 
singleStep = 0.1; 
// This means that I have 100/0.1 = 1000 numbers betwwen 0 and 100 
double stepsDbl = max/singleStep; 
int stepsInt = (int)(stepsDbl); 
cout << stepsDbl << stepsInt; 

:ステップ数はstepsIntおよび/またはstepsDblある

1000 999 

は何ですか:

1000 1000 

を、私はこの出力を取得していますがさらに、例えば0.2のようなsinglestepの値を違えば、間違った値が返されます。

500 499 

私は何が起こっているのか分かりませんが、かなり奇妙です...誰かがこの問題の解決策を持っているなら、私はその解決策に感謝します。

おかげ

答えて

0

てみてください

int stepsInt = (int)floor(stepsDbl+.5); 

「問題」は、浮動小数点数が内部的に格納されるためです。

1

(int)ゼロに向かってラウンドキャスト、および(double)算術は(浮動小数点演算を調べる)、本質的に信頼できません。 operator<<(double)は最も近い数値に丸められます。したがって、にナイキストキャストした場合、999.999999999999のようなFPの不正確さの結果の値は、1000と直接印刷され、999となります。

+1

実際には完全に信頼できます。 – Blindy

+1

@Blindy:Captain Pedanticモードでは、それは何のためにも完全に信頼できますが、それは明確に信頼できないものとして提示されています。そのような髪の分割は問題を混乱させ、役に立たない。 – geekosaur

+1

もう少し注意深い言葉遣いは、問題を混乱させるのを助けるでしょう:) – Blindy

0

プラットフォーム上の浮動小数点数は、有限バイナリ展開を持たない数値を正確に表すことはできません。したがって、これらの数値を使用すると当然不確実性があります。代わりに有理数を使用し、可能であれば "0.1"を "1/10"にしてください。

(「有限バイナリ拡張は」1/5が2のべき乗の有限和ではありません。「2のべき乗の有限和」を意味しない、とどちらも1/3も1/10である。)