0

浮動小数点数を使用して実数を近似する形式の規則を作成できるかどうかは疑問に思っています。

たとえば、浮動小数点数は次のように終了できます1.xxx777777(したがって、インスタンスによって無限の 7 で終了し、最終的には最後にランダムな数字で終了します) ?

浮動小数点数には次の形式しかないと思います:

1.正確な値。

2.のような値1.23900008721.... そのため、1.239「ノイズ」として表示される数字で近似されますが、正確な値とこのノイズの間には 0 があります

3.のような値。3.2599995ここで、はと最後の数字 (のような)3.26を加算することで近似されるため、実数のすぐ下の浮動小数点数で近似されます。9999..5

4.のような値2.000001、ここで2.0は実数のすぐ上の浮動小数点数で近似されます

4

2 に答える 2

3

あなたは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.2393.2599995は特別ではなく、どちらも特別ではありません3.26。コンパクトな10進数に正確に近いか、それに近いため、特別だと思います。しかし、それはバイナリ浮動小数点に違いはありません。


質問にC++のタグを付けたので、面白がる可能性のある情報をいくつか示します。

の形式で倍精度の数値を印刷する%.16eと、元のに変換される10進数が得られますdouble。ただし、必ずしも元のの正確な値を表すとは限りませんdouble。の正確な値をdouble10進数で表示するには、を使用する必要があります%.53e。プログラムで書く場合0.1、コンパイラはこれを意味として解釈します1.000000000000000055511151231257827021181583404541015625e-01、これは2進数の比較的コンパクトな数値です。あなたの質問は、3.2599995と2.000001について、これらが浮動小数点数であるかのように語っていますが、そうではありません。これらの数値をプログラムに書き込むと、コンパイラーはそれらを3.25999950000000016103740563266910612583160400390625および2.00000100000000013977796697872690856456756591796875として解釈します。したがって、探しているパターンは単純です。浮動小数点数の10進表現は、常に有効数字17桁で、その後に53-17=36の「ノイズ」桁が続きます。ノイズの数字はすべてゼロである場合があり、有効数字もゼロの束で終わる可能性があります。

于 2012-12-05T20:53:46.743 に答える
0

浮動小数点はビット単位で表されます。これが意味することは次のとおりです。

  1. 10 進数が 0.5 または 1/2 の後に 1 ビット反転
  2. 01 ビットは 0.25 または 1/4

これは、浮動小数点が常にほぼ近似していることを意味しますが、正確に 2 の累乗でない場合、マシンが処理できるものに関して表した場合、正確ではありません。

有理数はマシンによって非常に正確に表すことができます (もちろん、小数点以下の 2 のべき乗でない場合は正確ではありません) が、無理数は常にエラーを伴います。この点で、あなたの質問は とあまり関係がありませc++computer architecture

于 2012-12-05T20:34:03.583 に答える