2

私はこれを C プログラミング言語で何度も読みました。デフォルトでは、浮動小数点値は float ではなく double 型であるということです。

フロート PI = 3.14;

この場合、PI の値は 3.14-some_small_valueになります。これは精度の考慮によるものです。これは、8 バイトの値が4 バイトの変数に割り当てられるためです。メモリの観点から、または内部的にこれらの値がどのように変更されるかを説明してください。

4

1 に答える 1

4

この場合、観察された変化は、8 バイト形式から 4 バイト形式への変換とはあまり関係がありません。またはとして宣言するかどうかに関係なく、あなたのPI意志は とは異なります。値を 2 進浮動小数点形式で正確に表すことはできません。4、8、または 1234 バイトでは、 の正確なバイナリ表現を構築するにはまだ十分ではありません。従来のバイナリ浮動小数点形式では、この表現は無限に長いためです。3.14floatdouble3.143.14

の正確なバイナリ表現3.14

11.001000111101011100001010001010001111010... = 11.0(01000111101011100001010001)

01000111101011100001010001その部分が無限に何度も繰り返されることを意味します。を使用するfloatと、表現全体が の容量に切り捨てられ (または丸められ)、 のfloat場合はdoubleの容量に切り捨てられdoubleます。このため、浮動小数点型は3.14近似値のみを表します。doubleよりも正確になりますfloatが、それでも完全に正確ではありません。

この丸めは、 (GCC コンパイラからの結果) の場合と場合に3.14変わるものとまったく同じです。コンパイラが別の丸め戦略を使用している可能性があり、その結果、値がわずかに異なります。3.1400001049041748046875float3.140000000000000124344978758017532527446747double

于 2013-07-01T05:03:01.037 に答える