なぜ(INT)リターン33466389(* 1000000 33.46639)のでしょうか?
-
19-09-2019 - |
質問
(int)(33.46639 * 1000000)
を返します33466389
これはなぜ起こるのでしょうか?
解決
浮動小数点演算は完璧ではありません。 すべてのプログラマはそれについてに知っておくべきこと。
浮動小数点演算は、多くの人々によって、難解な対象と考えられています。浮動小数点は、コンピュータシステムに遍在しているので、これはかなり驚くべきことです。ほぼすべての言語では、浮動小数点データ型を持っています。パソコンからスーパーコンピュータまでのコンピュータは、浮動小数点アクセラレータを持っています。ほとんどのコンパイラは、随時、浮動小数点アルゴリズムをコンパイルするときに呼び出されます。事実上すべてのオペレーティングシステムは、オーバーフローなどの浮動小数点例外に応答しなければなりません。本論文では、コンピュータシステムの設計に直接影響を与える浮動小数点のこれらの側面についてのチュートリアルを提供します。それは、浮動小数点表現と丸め誤差の背景から始まり、IEEE浮動小数点標準の議論を続け、コンピュータビルダーは、より良い浮動小数点をサポートすることができる方法の多くの例で締めくくります。
...
のビットの有限数に無限に多くの実数を絞る近似表現を必要とします。無限に多くの整数であるが、ほとんどのプログラムで整数演算の結果は32ビットに格納することができます。対照的に、ビットの任意の固定数与え、実数最も計算が正確に多くのビットを用いて表現できない量を生成します。そのため、浮動小数点演算の結果は、多くの場合、その有限の表現にバックフィットするために丸められなければなりません。この丸め誤差は、浮動小数点演算の特徴です。
他のヒント
倍精度が正確なので、内部33.46639が実際33.466389として格納されていない
編集:リチャードが言ったように、)それは、浮動小数点データを'S(ビットの有限集合にバイナリ形式で格納されている)ので、それは正確にはない...
これは、1994年アンディ・グローブ、インテルのCEOの最後に大晦日だったものPentiumプロセッサが出てくると大ヒットさで、素晴らしい一年オフに来ていました。だから、彼はバーに歩いて、ジョニーウォーカーグリーンラベルのダブルショットを命じました。
バーテンダーが、それを務めて言った、 "それは$ 20の先生になります。"
グローブは、カウンターの上に20ドル札を入れた瞬間のためにそれを見て、と、言った「変更を維持します。」
その理由は33.46639がその数よりもわずかに小さいものとして表現されることがあります。
1000000で乗算すると、あなたに33466389.99999999を与えるだろう。
タイプキャストそしてちょうど整数部(33466389)を返します(int)を使用します。
あなたが「正しい」数をしたい場合は、型キャストの前に)(ラウンドしてみてください。
それは33466390
ならない理由を求めているならば、それはdouble
sは無限の精度を持っていない、と数は正確にバイナリで表現することができないためです。
double
(decimal
)と(int)(33.46639m * 1000000)
を交換した場合33466390
sがベース10で計算されるので、、それは、decimal
に等しくなる。
33.46639は、2進数の有限数で正確に表現できないため。 33.46639 * 1000000の実際の結果は33466389.9999999962747097015380859375です。キャストは33466389にそれを切り捨てます。