10 進数 (基数 10) では、1/3
0.33333 の繰り返しにしか近似できません。
近似値としてしか表現できない 2 進法に相当する数は?
10 進数 (基数 10) では、1/3
0.33333 の繰り返しにしか近似できません。
近似値としてしか表現できない 2 進法に相当する数は?
0.1 はその一例であり、0.2 も同様です。
この質問は、すでに非常に良い回答があるこの他の SO の質問にも似ています。
より適切な質問は、2 進数で正確に表現できる数値を尋ねることです。他のすべてのものは近似するか、まったく表現できません。
すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。
有限表現を使ってどの有理数を2進数で表現できるかを尋ねるつもりだと思います。これは、10進数の1/3の例から推測しています。事実、無限の表現を許可すれば、すべての有理数を2進数で表現できます。しかし、この質問は、有限の表現のみを許可する場合にのみ、コンピュータサイエンスの観点から興味深いものです。さらに、特定のコンピューター表現(たとえば、 IEEE 754)について質問しているのではなく、単に一般的な位置表現について質問していると仮定します。
の有理数は、のすべての素因数が除数である場合に限り、ベースで有限表現を表すことができp/q
ます。無理数は、どの基数でも有限表現を持ちません。(p, q) = 1
b
q
b
特に、の有理数は、のすべての素因数が除数である場合に限り、2進数の有限表現として表すことができp/q
ます。つまり、2進数で有限表現を持つ有理数は、非負の整数の場合のみです。さらに、そのようなすべての有理数は、2進数の有限表現で表すことができます。これらの数は2進分数として知られています。(p, q) = 1
q
2
p/q
(p, q) = 1
q = 2^k
k
その表記法では正確に表現できない無限の数がありますが、ここでは 1/10 を示します。
基数 2 で正確に表現できる数は、2進有理数です。これらは、整数 k と整数 n に対して k/2^n の形式で記述できる数値です。その形式で記述できない数値は、基数 2 で非終了表現になります。
ただし、基数 2 で表現可能な数値ではなく、float
orなどの固定浮動小数点型で表現可能な数値について質問しているようですdouble
。これはもっと微妙な質問です。2 進有理数でない数は表現できませんが、すべての 2 進有理数も表現できるわけではありません。
整数 k と整数 n の k/2^n として表現できないすべての数値です。
これらすべての数を見つける簡単な方法は、2 を含まないいくつかの素数を書き留めることです。3、5、7、11、13、17、および 19 は、2 を含まない素数の良い例です。
増殖開始。1/3、2/3、1/5、2/5、3/5、4/5、1/6、5/6、1/7、2/7など
これを行い、k/2^n 形式の数値を避けると、2 進数で正確に表現できない可能性のあるすべての分数を列挙することになります。
左端の 64 ビットがすべて同一である数値に到達したら、おそらく列挙を停止する必要があります。
Python 2.4 の場合:
>>> 1.0 / 5.0
0.20000000000000001
これは、基数 2 を正確に表現するのが難しいことを示しています。
2 進数 (.00011001100110011...) == 10 進数 (.1)
無限に突き刺すんだ
基数 10 で正確に表すことができない同じ数のセットは、基数 2 で正確に表すことはできません。そこに違いはないはずです。