IEEE754 で数値を正確に表すことができるのは (少なくとも単精度および倍精度のバイナリ形式の場合)、使用可能なビット数に応じて、2の逆べき乗 (つまり、、など) を加算して構成できる場合のみです。精度のために。2-n
1
1/2
1/4
1/65536
float (23 ビットの精度)またはdouble (52 ビットの精度)によって提供されるスケーリング内で、正確に 101.1 になる 2 のべき乗の反転の組み合わせはありません。
この 2 のべき乗の反転がどのように機能するかについての簡単なチュートリアルが必要な場合は、この回答を参照してください。
その答えからの知識をあなたの数値に適用します101.1
(単精度浮動小数点数として):
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n
0 10000101 10010100011001100110011
| | | || || || |+- 8388608
| | | || || || +-- 4194304
| | | || || |+----- 524288
| | | || || +------ 262144
| | | || |+--------- 32768
| | | || +---------- 16384
| | | |+------------- 2048
| | | +-------------- 1024
| | +------------------ 64
| +-------------------- 16
+----------------------- 2
その仮数部分は実際には永遠に続きます101.1
:
mmmmmmmmm mmmm mmmm mmmm mm
100101000 1100 1100 1100 11|00 1100 (and so on).
したがって、精度の問題ではなく、IEEE754 形式でその数値を正確に表す有限ビットの量はありません。
ビットを使用して実際の数 (最も近い近似値) を計算すると、符号は正になります。指数は 128+4+1 = 133 - 127 バイアス = 6 なので、乗数は 2 6または 64 です。
仮数部は、1 (暗黙の基数) と (n は 1 から始まり、右に増加するため、それぞれが 1/(2 n ) の値を持つすべてのビットに対して) で構成され{1/2, 1/16, 1/64, 1/1024, 1/2048, 1/16384, 1/32768, 1/262144, 1/524288, 1/4194304, 1/8388608}
ます。
これらをすべて足し合わせると、 になります1.57968747615814208984375
。
これに、前に計算した乗数 を掛けると64
、 が得られ101.09999847412109375
ます。
すべての数値はbc
100 桁のスケールを使用して計算されたため、多くの後続ゼロが発生するため、数値は非常に正確である必要があります。結果を次のように確認したため、二重にそうです。
#include <stdio.h>
int main (void) {
float f = 101.1f;
printf ("%.50f\n", f);
return 0;
}
それも私に与えました101.09999847412109375000...
。