- ベストアンサー
floatの有効桁数
floatの有効桁数を調べていると(インターネット)、6桁や7桁というように、サイトによって異なっていました。 私はc言語でfloatが32bitの時を知りたいのですが、どのサイトが本当なのかなどが分かりませんでした。 なぜサイトによってさまざまな有効桁数を書いているのか? 結局floatの有効桁数は何桁なのか? が知りたいです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
IEEE754の単精度浮動小数点数では、符号1ビット、指数部8ビット、仮数部23bitの32bitで数値を表現しています。 (厳密に言えば、Cの言語仕様では、floatの内部表現がどうなっているかは規定されていませんが、今時大抵のコンピュータでは、このIEEE754に基づいた内部表現が使われていますので、32bitの内訳がこれ以外の環境を考える必要はまずないと思います) さて、この仮数部23bitに対し、最上位に暗黙の1が追加された24bitを仮数として浮動小数点表記を行うわけですが、 ここで安直に「だから有効精度は24bit」にはならないことに注意してください。最上位は1で固定なのですがから、24bit分の表現能力は持っていないのです。 このとき、表現できる数値の最小差は、2進数表記で 1.0000_0000_0000_0000_0000_000b: 二進数で1の後に0が23個(仮数部表現23bitの値が0) 1.0000_0000_0000_0000_0000_001b: 二進数で1の後に0が22個で1(仮数部表現23bitの値が1) になります。(桁数をわかりやすくするため、途中に_を入れました) これは、10進数で表すと、 1と1.00000_01192_0929になります。つまり、 0.00000_01192_0929 がIEEE754単精度浮動小数点数の精度です。 これを、 ・ほぼ0.00000_01 が表現可能だから、精度は7桁と見る ・厳密には0.00000_01は表現できず、違いがちゃんと表現可能なのは、0.00000_1 までなので、精度は6桁と見る のどちらと取るかは考え方の違いになります。 これを言い換えれば、log_10(2^23)=6.92369を元に、 ほぼ表現可能な桁数を考えて、四捨五入した7桁を精度とするか、 厳密に表現可能な桁数を考えて、切り捨てた6桁を精度とするか、 という話になります。
その他の回答 (3)
- pondbook
- ベストアンサー率53% (7/13)
いろいろなサイトを見たそうなので現在の標準的な浮動小数点フォーマットがIEEE754という形式だということは知っていると思います。 サイト例:Wikipedia http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0 IEEE754のフォーマットでは32ビットを 1ビット(符号)、8ビット(指数部2進数)、23ビット(仮数部2進数) に割り当てます。 ここで仮数の部分が有効数字を決めるので単純に10進数での有効桁数の目安は LOG10(仮数部の整数最大値)で計算します。 23ビットで考えると LOG10(2^23) = 6.92…となります。 これは6桁は十分表せるが7桁までは届かない、ということになります。 一方、このIEEE754という形式はがんばって精度を上げようということで仮数部に暗黙の1ビットというのをもっています。 指数部が全部0で無い場合、この暗黙の1ビットが最上位についたように取り扱うので24ビットに見えます。 すると LOG10(2^24)= 7.22…となり 7桁の有効桁になります。 こうみると厳密には6桁でしか表現できない部分もあるので安全をみて6桁という人もあれば、おおむね7桁表現しているんだから7桁とよんでもいい、という人も出てくるのでしょう。 仕事で演算を多用するときは、そんなあいまいな部分は使えないので6桁と考えて扱うか、大抵は倍精度(64ビット長)の形式を使うはずです。 その場合も仮数部は52ビットですので安全をみて LOG10(2^52) = 15.65…→ 15桁を有効桁と考えて処理します。 IEEE754ではない固有のフォーマットを使用している場合は LOG10(2^仮数部ビット数) で桁数の目安を計算してみてください。
- don_go
- ベストアンサー率31% (336/1059)
浮動小数点数の内部構造は1つではなく、複数の形式が 有ります。 浮動小数点数 http://ja.wikipedia.org/wiki/浮動小数点数 浮動小数点数型と誤差 http://www.cc.kyoto-su.ac.jp/~yamada/pB/float.html >float 型の精度(有効桁数)は2進数にして 24 (=23+1) > 桁であり,10進数では約 7 桁となる. また、作成者(メーカー)やバージョンによっても異なる 場合があります。 C言語 浮動小数点の最大値 最小値 http://simd.jugem.jp/?eid=18 >ちなみに、浮動小数点の有効桁数ですが >VC8では、float型が6桁、double型とlong double型が >15桁となっています。 > >C++Builderを見てみると、 >float型が6桁、double型が15桁、long double型が18桁 >となっていました。 従って有効桁数は、何を使用するかによって変わります。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
includeファイル: float.h に仮数部のbit数: FLT_MANT_DIG が定義されています。 VC++2010β2では24でした。24bitで表現されているなら...わかりますね。
お礼
ここに皆さんへのお礼をまとめて書かせていただきます。 参考になりました。 ありがとうござます。