あなたは10進数、つまり正または負n*(10^e)
のいずれかで、として表すことができる数の観点から考えています。e
これらの数字は、10本の指を持つことに関係する歴史的な理由から、思考プロセスで自然に発生します。
コンピュータ番号は、電気信号が存在するか存在しないかに関係する技術的な理由から、2進数で表されます。
小さい整数を扱う場合、数学的な数値の正確な近似を考えているので、コンピューターの表現が自分のものと一致しなくても問題はありません。コンピューターもそうです。推移性によって、あなたとコンピュータは同じことを考えています。
非常に大きい数または非常に小さい数の場合、10の累乗で考える傾向があり、コンピューターは間違いなく2の累乗で考えます。これらの場合、あなたはあなたの直感とコンピュータがすることとの違いを観察することができます、そしてまたあなたの分類はナンセンスです。2進浮動小数点数は、10進数としてコンパクトに表現されている、密度の高い数値でも密度の低い数値でもありません。それらは単純にバイナリで表されますn*(2^p)
。p
正または負のいずれか。多くの実数は10進数で近似表現しかないため、多くの実数は2進数で近似表現しかありません。これらの数値は同じではありません(2進数は10進数で表すことができますが、常にコンパクトに表すとは限りません。一部の10進数は、まったく2進数で正確に表すことができません(例:0.1))。
コンピューターの浮動小数点数を理解したい場合は、10進数で考えるのをやめる必要があります。1.23900008721....
は特別ではなく、どちらも特別ではありません1.239
。3.2599995
は特別ではなく、どちらも特別ではありません3.26
。コンパクトな10進数に正確に近いか、それに近いため、特別だと思います。しかし、それはバイナリ浮動小数点に違いはありません。
質問にC++のタグを付けたので、面白がる可能性のある情報をいくつか示します。
の形式で倍精度の数値を印刷する%.16e
と、元のに変換される10進数が得られますdouble
。ただし、必ずしも元のの正確な値を表すとは限りませんdouble
。の正確な値をdouble
10進数で表示するには、を使用する必要があります%.53e
。プログラムで書く場合0.1
、コンパイラはこれを意味として解釈します1.000000000000000055511151231257827021181583404541015625e-01
、これは2進数の比較的コンパクトな数値です。あなたの質問は、3.2599995と2.000001について、これらが浮動小数点数であるかのように語っていますが、そうではありません。これらの数値をプログラムに書き込むと、コンパイラーはそれらを3.25999950000000016103740563266910612583160400390625および2.00000100000000013977796697872690856456756591796875として解釈します。したがって、探しているパターンは単純です。浮動小数点数の10進表現は、常に有効数字17桁で、その後に53-17=36の「ノイズ」桁が続きます。ノイズの数字はすべてゼロである場合があり、有効数字もゼロの束で終わる可能性があります。