質問

(int)(33.46639 * 1000000)を返します33466389

これはなぜ起こるのでしょうか?

役に立ちましたか?

解決

浮動小数点演算は完璧ではありません。 すべてのプログラマはそれについてに知っておくべきこと。

  

浮動小数点演算は、多くの人々によって、難解な対象と考えられています。浮動小数点は、コンピュータシステムに遍在しているので、これはかなり驚くべきことです。ほぼすべての言語では、浮動小数点データ型を持っています。パソコンからスーパーコンピュータまでのコンピュータは、浮動小数点アクセラレータを持っています。ほとんどのコンパイラは、随時、浮動小数点アルゴリズムをコンパイルするときに呼び出されます。事実上すべてのオペレーティングシステムは、オーバーフローなどの浮動小数点例外に応答しなければなりません。本論文では、コンピュータシステムの設計に直接影響を与える浮動小数点のこれらの側面についてのチュートリアルを提供します。それは、浮動小数点表現と丸め誤差の背景から始まり、IEEE浮動小数点標準の議論を続け、コンピュータビルダーは、より良い浮動小数点をサポートすることができる方法の多くの例で締めくくります。

     

...

     

のビットの有限数に無限に多くの実数を絞る近似表現を必要とします。無限に多くの整数であるが、ほとんどのプログラムで整数演算の結果は32ビットに格納することができます。対照的に、ビットの任意の固定数与え、実数最も計算が正確に多くのビットを用いて表現できない量を生成します。そのため、浮動小数点演算の結果は、多くの場合、その有限の表現にバックフィットするために丸められなければなりません。この丸め誤差は、浮動小数点演算の特徴です。

他のヒント

倍精度が正確なので、内部33.46639が実際33.466389として格納されていない

編集:リチャードが言ったように、)それは、浮動小数点データを'S(ビットの有限集合にバイナリ形式で格納されている)ので、それは正確にはない...

これは、1994年アンディ・グローブ、インテルのCEOの最後に大晦日だったものPentiumプロセッサが出てくると大ヒットさで、素晴らしい一年オフに来ていました。だから、彼はバーに歩いて、ジョニーウォーカーグリーンラベルのダブルショットを命じました。

バーテンダーが、それを務めて言った、 "それは$ 20の先生になります。"

グローブは、カウンターの上に20ドル札を入れた瞬間のためにそれを見て、と、言った「変更を維持します。」

http://en.wikipedia.org/wiki/Pentium_FDIV_bugする

その理由は33.46639がその数よりもわずかに小さいものとして表現されることがあります。

1000000で乗算すると、あなたに33466389.99999999を与えるだろう。

タイプキャストそしてちょうど整数部(33466389)を返します(int)を使用します。

あなたが「正しい」数をしたい場合は、型キャストの前に)(ラウンドしてみてください。

それは33466390ならない理由を求めているならば、それはdoublesは無限の精度を持っていない、と数は正確にバイナリで表現することができないためです。

もしdoubledecimal)と(int)(33.46639m * 1000000)を交換した場合33466390sがベース10で計算されるので、

、それは、decimalに等しくなる。

33.46639は、2進数の有限数で正確に表現できないため。 33.46639 * 1000000の実際の結果は33466389.9999999962747097015380859375です。キャストは33466389にそれを切り捨てます。

あなたは異なる結果を得た理由は、あなたが「のキャストの」

を使用しているという事実であります
(int)(33.46639 * 1000000) returns 33466389
^^^^^

'int型のタイプ...切り上げかのどちらかに結果をキャストするために十分に正確であることを浮動小数点に依存していません.... "int型に変換され、その後一緒に掛け合わさと一体型のダウン....スキートは彼のサイトここここの...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top