(int)(33.46639 * 1000000)
戻り値33466389
なぜこれが起こるのですか?
(int)(33.46639 * 1000000)
戻り値33466389
なぜこれが起こるのですか?
浮動小数点の計算は完璧ではありません。 すべてのプログラマーがそれについて知っておくべきこと。
浮動小数点演算は、多くの人にとって難解な主題と見なされています。浮動小数点はコンピュータシステムに遍在しているため、これはかなり驚くべきことです。ほとんどすべての言語には浮動小数点データ型があります。PCからスーパーコンピューターまでのコンピューターには浮動小数点アクセラレーターがあります。ほとんどのコンパイラは、浮動小数点アルゴリズムを時々コンパイルするように求められます。また、事実上すべてのオペレーティングシステムは、オーバーフローなどの浮動小数点例外に応答する必要があります。このホワイトペーパーでは、コンピュータシステムの設計者に直接影響を与える浮動小数点の側面に関するチュートリアルを紹介します。浮動小数点表現と丸め誤差の背景から始まり、IEEE浮動小数点標準の説明に続き、コンピュータービルダーが浮動小数点をより適切にサポートする方法の多数の例で終わります。
..。
無限に多くの実数を有限のビット数に圧縮するには、近似表現が必要です。整数は無限にありますが、ほとんどのプログラムでは、整数計算の結果を32ビットで格納できます。対照的に、ビット数が固定されている場合、実数を使用したほとんどの計算では、その数のビットを使用して正確に表すことができない量が生成されます。したがって、浮動小数点計算の結果は、有限表現に戻すために丸められることがよくあります。この丸め誤差は、浮動小数点計算の特徴です。
倍精度は正確ではないため、内部的に33.46639は実際には33.466389として格納されます。
編集:リチャードが言ったように、それは浮動小数点データ(有限のビットセットでバイナリに格納されている)なので、正確にはそうではありません)...。
1994年の終わりには大晦日でした。IntelのCEOであるAndyGroveは、Pentiumプロセッサが登場し、大ヒットしたことで、素晴らしい年を迎えました。それで、彼はバーに入って、ジョニーウォーカーグリーンレーベルのダブルショットを注文しました。
バーテンダーはそれを提供し、「それは20ドルになります、サー」と言いました。
グローブは20ドル札をカウンターに置き、しばらくそれを見て、「変化を続けなさい」と言いました。
その理由は、33.46639がその数よりわずかに少ない数として表されるためです。
1000000を掛けると、33466389.99999999になります。
(int)を使用した型キャストでは、整数部分(33466389)が返されます。
「正しい」数値が必要な場合は、型キャストの前にround()を試してください。
なぜそれがにならないのかと尋ねるなら33466390
、それはdouble
sが無限の精度を持たず、数値を2進数で正確に表すことができないためです。
を( )に置き換えるdouble
と、 sは10進数で計算されるため、に等しくなります。decimal
(int)(33.46639m * 1000000)
33466390
decimal
33.46639は、有限数の2進数で正確に表現できないためです。33.46639 * 1000000の実際の結果は、33466389.9999999962747097015380859375です。キャストはそれを33466389に切り捨てます。