固定小数点と浮動小数点数


109

Google全体で固定小数点と浮動小数点の定義を読みにくいため、固定小数点と浮動小数点の数を理解できません。しかし、私が読んだものはどれも、それらが実際に何であるかについて十分に単純な説明を提供していません。例を使ってわかりやすい定義を取得できますか?


また、適切な定義を見つけるのに苦労しています。私が探している主なものは、これらの結果を理解するのに役立つものです:3.11 + 42.0 = 45.110001(45.11ではない)、3.12 + 42.0 = 45.119999(45.12ではない)、3.15 + 42.0 = 45.150002(45.15ではない)。
Bart S.

1
私は特に、固定小数点と浮動小数点数とより良い精度でトラップを説明し、あなたがfloatとしてお金をdescibeしたいことがありませんでした理由(これは、関連する議論だと思う。stackoverflow.com/questions/6320209/...
アンドリュー・ノーマン

トピックが言及されているランダムリンク「OpenGL®ES OpenGL ESには、浮動小数点および固定小数点システムのプロファイルとEGL™仕様が含まれています...」
The Red Pea

回答:


145

固定小数点数には、整数部(小数点の左側の部分)用に予約された特定のビット数(または桁)と、小数部(小数点の右側の部分用)に予約された特定のビット数があります。ポイント)。数値がいくら大きくても小さくても、各部分に常に同じビット数を使用します。たとえば、固定小数点形式が10進数のIIIII.FFFFF場合、表現できる最大の数値は99999.999990で、ゼロ以外の最小の数値はになります00000.00001。このような数値を処理するコードのすべてのビットには、小数点の位置に関する組み込みの知識が必要です。

浮動小数点数は、整数部または小数部に特定のビット数を予約しません。代わりに、特定の数のビット(仮数または仮数と呼ばれます)と特定のビット数を予約してその数の中で小数点以下がどこにあるか(指数と呼ばれます)を示します。そのため、指数用に2桁が予約されている10桁の浮動小数点数は、の最大値9.9999999e+50と最小の非ゼロ値を表す可能性があり0.0000001e-49ます。


8
まあ、浮動小数点数はほとんど常に符号付きであることを忘れているので、最小値は本当にになります-9.9999999e+50
ブライアンゴードン

4
また、指数バイアスがあり、0と1の間で1,000,000から1,000,001の間よりもはるかに多くの離散値を表すことができます。そして、バイアスが精度を上げるのに十分でないときに2つの非常に類似した数値の差として0を報告しないようにするなど、浮かび上がる浮動小数点演算には多くの複雑な問題があります。
ブライアンゴードン

28
@BrianGordon:私はサインビットを忘れていませんでした。簡単な説明をするために意図的に無視し、最小/最大と最小/最大の違いを気にする必要がありません。また、指数バイアス(任意の2つの数値間の離散値の数とは関係ありません)、NaN、無限大、正規化、漸進的アンダーフロー、符号付きゼロを意図的に省略しました。ほとんどの浮動小数点はバイナリ(最初のビットを許可)省略される仮数部)、および概念を説明するために不要な他の多くの側面。
Gabe、2009

2
固定小数点の最小数のカットオフはなぜ00000.00001ですか?00000.00000代わりに見ると期待しています。また、固定小数点数について詳しく説明している参考資料はありますか?
Nicholas Miller

4
@NickMiller:混乱して申し訳ありませんが、私はゼロ以外の数値について話していました。私の例の形式は、0、0.00001、0.00002、...、99999.99998、99999.99999を表すことができます。
Gabe 14

31

固定小数点数は、小数点の後の桁数が固定であることを意味します。浮動小数点数では、小数点以下の桁数を変えることができます。

たとえば、小数点の後に正確に4桁を必要とする数値を格納する方法がある場合、それは固定小数点です。その制限なしでは、それは浮動小数点です。

多くの場合、固定小数点を使用する場合、プログラマーは実際には整数を使用し、一部の桁が小数点を超えていると想定します。たとえば、2桁の精度を保持したい場合、値100は実際には1.00を意味し、101は1.01を意味し、12345は123.45を意味します。

浮動小数点数は、同じように非常に小さい数値または非常に大きい数値を表すことができるため、より一般的な目的ですが、小数点以下の桁数を格納するための追加のストレージが必要になるという小さなペナルティがあります。


2
たとえば、非常に小さい浮動小数点数と非常に大きい浮動小数点数を一緒に追加する場合など、それらを使用して計算を開始すると、浮動小数点の使用が問題になります。合計された結果は、2つの極値を持つ数値を表す必要があり、下位の小数が切り捨てられる(丸められない)ため、精度が低下します。
Andrew Norman

2
また、浮動小数点での指数値の使用の可能性は、標準的な数字を期待して、コンピュータシステムの問題を引き起こす可能性があります
アンドリュー・ノーマン

5

私の理解では、固定小数点演算は整数を使用して行われます。小数部は固定ビット数で格納されるか、または数値に必要な小数精度の桁数を乗算します。

たとえば、数値12.34を格納する必要があり、小数点以下2桁の精度が必要な場合、数値を乗算して100を取得し1234ます。この数値で計算を実行するときは、このルールセットを使用します。この数に5620または56.20を追加すると6854、データまたはになり68.54ます。

固定小数点数の小数部分を計算する場合は、モジュロ(%)オペランドを使用します。

12.34(疑似コード):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

浮動小数点数は、プログラミングではまったく異なります。浮動小数点数の現在の標準では、数値のデータに23ビット、指数に8ビット、符号に1を使用しています。詳細については、このWikipediaのリンクを参照してください。


3

「固定小数点」という用語は、小数点が固定された桁数の後に、場合によってはその前に、固定桁数で数値が表される対応する方法を指します。浮動小数点表現では、小数点の配置は、数値の有効数字に対して「浮動」できます。たとえば、小数点配置規則が統一された固定小数点表現は、123.45、1234.56、12345.67などの数値を表すことができますが、浮動小数点表現はさらに1.234567、123456.7、0.00001234567、1234567000000000などを表すこともできます。


-6

番号123.456789を取得

  • 整数として、この数は123になります。
  • 固定小数点(2)として、この数値は123.46になります(切り上げた場合)
  • 浮動小数点として、この数値は123.456789になります。

浮動小数点を使用すると、ほとんどすべての数値を非常に正確に表すことができます。修正済みの方が正確ではありませんが、コンピュータの方が簡単です。


11
数値を書くことができる精度は、それが浮動小数点、整数、または固定小数点のどちらで書かれているかには関係ありません。これは、利用可能な有効桁数に関連しています。たとえば、INT_MAXはintとして正確に表すことができる数値ですが、正確に表すために必要な31ビットの精度がないため、floatとしてはできません。
Kian

1
問題の数を処理できるサイズであれば、fixedが最も正確です。固定小数点数を使用して計算を行う場合、計算の余りが小数の制限を超えると丸めが発生します。浮動小数点を使用すると、非常に大きな数値に非常に小さな数値を追加すると、非常に不正確な値が得られる可能性があります。それが発生すると、桁は丸められずに失われます
Andrew Norman

これは誤解を招きやすく、間違っています。固定小数点とは、小数点以下の桁数が固定であることを意味します。それがどれほどの精度を持っているかについては何も述べていません。
オスカースミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.