2011-08-10 16 views
4

次のコードはC言語と同じように動作しますが、なぜですか?ここでIEEE 754:どのように正確に機能しますか?

float x = 2147483647; //2^31 
printf("%f\n", x); //Outputs 2147483648 

は私の思考プロセスである:

2147483647 = 0  1001 1101  1111 1111 1111 1111 1111 111 

    (0.11111111111111111111111)base2 = (1-(0.5)^23)base10 
=> (1.11111111111111111111111)base2 = (1 + 1-(0.5)^23)base10 = (1.99999988)base10 

したがって、バック小数点にIEEE 754の表記に変換する:だから技術的に1.99999988 * 2^30 = 2147483520

を、Cプログラムは、右、2147483520をプリントアウトしておく必要があります?

答えて

3

後者は表現不可能「理想」に近いように表現される値がこのように表現することができる2147483647次の二つの値は2147483520と2147483648

ているであろう、それは使用されます:で浮動小数点の場合、値は丸められ、切り捨てられません。

1

The standard is available here。 IEEE(およびそのような他の組織)は、規格を販売し、組立、受諾のためのロビー活動、標準の品質向上に費やすコストを主に賄うことで、お金を稼ぐため、購入する必要があるかもしれません。

ビットのみが「私は言葉を使用する場合は、」ハンプティ・ダンプティは、むしろ軽蔑口調で言った、「それ は、私はそれが意味することを選択しただけで何を意味し、誰かが

なるためにそれらを指示するものを意味 - それ以上ではない。 " 質問は、"あなたは言葉を作ることができるかどうかは、多くの異なることを 意味するかどうか、 "アリスは言った。 Humpty Dumpty氏は、次のように述べています。「 になるのは、それだけです。

この場合、IEEEはビットが何を意味するのかを決定しました。また、printfフラグ%fが適切な人間の表現をプリントアウトする理由は、同じ基準。

時折、あなたは(int型のような)別のデータ型にビットをキャストするために管理し、これらのビットの「その他」の表現をプリントアウトすることができます。 Cは多くの通常の番号のプロモーションをキャッチしますが、間違ったタイプのポインタを正しいアドレスに割り当てる(そして参照を外す)の助けを借りて、それを混乱させることができます。

数学を手作業で行っている間は、実際のハードウェアでは正確に数学を行うことが保証されていません。整数の数学では、表現の精度ははるかに高くなりますが、浮動小数点演算では、数値を丸める方法が出力に大きな違いをもたらします。浮動小数点エラーについては言及していませんが、時々システムに焼かれました(たぶん頻繁ではありません)。

1

浮動小数点形式は、それは、常に1ですあなたはそれを保存するためにビットを使用する必要はありませんので、仮数部の最上位ビットが常に1である「正規化された形式」であることが多いです。したがって、そのような数値表現をデコードするときは、1を先頭に追加する必要があります。

1
2147483647 = 2^31 - 1 = +1 * 2^30 * 1.1111 1111 1111 1111 1111 1111 1111 11 

この数値をIEEE 754-1985単精度形式でエンコードすると、有効数字は正しく丸められます。丸めモードを最も近い辺に丸める場合は、(デフォルトの丸めモード)でも切り上げられます。丸め前

exponent = 30, significand = 1.1111 1111 1111 1111 1111 1111 1111 11 

小数点以下23桁の有効数字を丸めた後:

exponent = 30, significand = 10.0000 0000 0000 0000 0000 000 

正規化後:単精度形式でエンコード

exponent = 31, significand = 1.0 

1 | 10011110 | 00000000000000000000000 
関連する問題