[解決済み】なぜ10進数は2進数で正確に表現できないのですか?
質問
SOには、浮動小数点数の表現について、いくつかの質問が投稿されています。例えば、10進数の0.1は正確な2進数表現を持っていないので、==演算子を使って他の浮動小数点数と比較するのは危険です。浮動小数点数の表現原理は理解している。
数学的な観点から、なぜ小数点の右側にある数字は左側にある数字よりも特別なのでしょうか?
たとえば、61.0という数字は正確な2進法で表現されます。なぜなら、どんな数字も積分部分は常に正確だからです。しかし、6.10という数値は正確ではありません。10進数を1つ動かしただけなのに、突然ExactopiaからInexactvilleになってしまったのだ。数学的には、この2つの数字には本質的な違いはないはずです。
一方、小数点を1桁下げて「610」という数字を出しても、ここは「エキザクトピア」のままだ。その方向(6100、610000000、610000000000000)に進み続けても、正確、正確、正確なのです。しかし、小数点以下の数字がある閾値を超えると、数字はもはや正確ではなくなります。
どうなっているんだ?
編集:明確にするために、私はIEEEなどの業界標準の表現についての議論から離れ、私が信じる数学的に"純粋な"方法にこだわりたいのです。10進法では、位置の値は次のとおりです。
... 1000 100 10 1 1/10 1/100 ...
バイナリでは、こうなる。
... 8 4 2 1 1/2 1/4 1/8 ...
また、これらの数字には任意の制限が加えられていない。位置は左へ右へと無限に増えていく。
解き方は?
10進数
可能
は、十分なスペースがあれば、正確に表現することができます。
バイナリ
の点数です。もし、浮動小数点数の
10進数
ポイント型(例.
System.Decimal
の場合、2進浮動小数点では正確に表現できない多くの値を正確に表現することができます。
例えば、皆さんが慣れ親しんでいる10の底では、1/3を正確に表現することはできません。0.3333333なのですが...。(繰り返し)です。0.1を2進数の浮動小数点数で表現できないのも、まったく同じ理由です。3、9、27は正確に表現できますが、1/3、1/9、1/27は表現できないのです。
問題は、3が10の倍数でない素数であることだ。それは、次のような場合には問題にはならない。 乗算 を3倍することで、常に整数を掛けることができ、問題が発生することはありません。しかし 割る を、素数で基数の因数でない数で割ると、トラブルに見舞われることがあります(そして ウィル 1をその数で割ろうとすると、そうなります)。
0.1 は通常、2 進浮動小数点では正確に表現できない正確な 10 進数の最も単純な例として使用されますが、間違いなく 0.2 は 1/5 であり、5 は 10 進数と 2 進数の間で問題を引き起こす素数なので、より単純な例と言えます。
有限表現の問題に対処するための副次的なメモ。
浮動小数点型の中には、以下のようにサイズが固定されているものがあります。
System.Decimal
のようなものもあります。
java.math.BigDecimal
しかし、システムメモリであれ、配列の理論的な最大サイズであれ、ある時点で限界に到達します。しかし、これはこの回答の主旨とは全く別のポイントです。たとえ、本当に任意の数のビットを使用できたとしても、10進数の0.1を浮動2進数表現で正確に表現することはできないのです。逆に、任意の数の10進数がある場合、以下のようになります。
できる
浮動2進数として正確に表現できる数であれば、どんな数でも正確に表現することができます。
関連
-
[解決済み】Mathematica の行列の対角化
-
[解決済み] LaTeX: 数学モードで3行をスタックする
-
[解決済み] Latexで関数の下に文字を配置するには?
-
[解決済み] neither...or "を数学的論理式に変換する。
-
[解決済み] 2つの整数の最小公倍数を計算する最も効率的な方法は何でしょうか?
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み】ポリゴンの点のリストが時計回りに並んでいるかどうかを判断する方法は?
-
[解決済み】円内のランダムな点を生成する(一律)。
-
[解決済み】最小値と最大値がわかっている数値の範囲を縮小する方法
-
[解決済み] 複数の緯度経度座標ペアの中心点を計算する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】n個のノードを持つ有向グラフの最大エッジ数は何個ですか?[クローズド]。
-
[解決済み] 大きな符号なし2進数から小さな2進数の引き算
-
[解決済み] LaTeX: 数学モードで3行をスタックする
-
[解決済み] Mathematica の行列対角化
-
[解決済み] tf.truncated_normalとtf.random_normalの違いは何ですか?
-
[解決済み] バイトからメガバイトへの変換
-
[解決済み】「エントロピーと情報利得」って何?
-
[解決済み】円内のランダムな点を生成する(一律)。
-
[解決済み】線分の法線ベクトルを計算するには?[クローズド]。
-
[解決済み] GUIDは常に一意であると仮定しても安全ですか?