Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

floatの小数点以下の桁数

C言語の基本的な質問をさせてください。
小数を扱いたくて、CC-RLコンパイラマニュアルを見たら
float 1.17549435E-38F ~ 3.40282347E+38F
と、なっていました。

例えば
30.123456789という数値がある場合、
floatでは、30.1234567の小数点以下7桁までしか扱えないという考えはまちがっていますか?
(~3.40282347E+1 = 34.0282347 で、小数点以下7桁)

40.1234567の場合は、40.123456の小数点以下6桁までしか扱えない
(~340.282347E+0 = 340.282347 で、小数点以下6桁)と思い、
ウォッチ式を見たら、どちらも小数以下5桁までしか表示されていませんでした。

よろしくお願いします。

  • わわいです

    「浮動小数点数 フォーマット」でぐぐると、floatやdouble の数値フォーマットが出てきます
    まあ、これで出てくるものはPC上のものですが、にたよーな形式なので参考になると思います

    #お使いのコンパイラのマニュアルなどでfloat、doubleの表現形式は確認しときましょう

    浮動小数点数から引用

    これによると仮数部は23bitの表現です
    23bitで表現できる数値は、0から8338608-1まで、ということで、全部ひっくるめて7桁までしか表現できませんね

  • In reply to わわい:

    わわいです
    PCで表現するfloatの仮数部の数値は23bitで、0から8338608-1まで、と書きましたが、ぢつはこれは間違ってまして、上記の引用元をよく読むと、

    > 2進法で正規化をすると、最上位ビットは常に1になるので、これを表さず常に1があるものとみなす省略が可能で、省略した表現をケチ表現などと言う。この省略を使うと、仮数部に割り当てたビット数がnであれば、有効桁数はn+1となる。

    と書いてあります
    こういう表現のため、仮数部で表現できる数値は、1から24ビット分の16777215となり、7桁分とちょっと、ということになりますねー

    え?んじゃゼロはどーすんだ?という疑問はごもっとも。
    ゼロの場合は特別なビットパターンを定義することで表現していますね(引用元に書いてあります)

    #ここに書いてる表現がそのまま採用されているとは限らないので、くれぐれも使ってるコンパイラのマニュアルを読むように

  • > 30.123456789という数値がある場合、
    > floatでは、30.1234567の小数点以下7桁までしか扱えないという考えはまちがっていますか?

    間違っています。

    CC-RL で扱う float の内部表現はマニュアルに依ると IEC 60559:1989 に従っており、仮数部の精度が 24ビット なので、整数部と小数点以下を合わせた全体で10進数に換算して 7桁ちょっとの精度ということになります。 

    float で表せる 30.123456789 に近い値は  30.123455047607421875 か 30.1234569549560546875 ですが、プログラムで変数に直値を代入した場合、実際に変数に代入されるのは誤差が小さい方の 30.1234569549560546875 でしょう。

    30.123455047607421875
    30.123456789
    30.1234569549560546875

    10進数に換算して 7桁ちょっとの精度とは凡そこういうことです。

    > 小数を扱いたくて、CC-RLコンパイラマニュアルを見たら
    > float 1.17549435E-38F ~ 3.40282347E+38F
    > と、なっていました。
    > (~3.40282347E+1 = 34.0282347 で、小数点以下7桁)

    float で表せる値の範囲の説明であり精度のそれではありません。

  • In reply to fujita nozomu:

    わわいさん,fujita nozomuさんありがとうございます。
    書かれた内容は、理解できました(多分)。

    理解できたと言っておきながら、理解できていない様な返信を書きますが、
    (うまく言えないのですが,)

    >>仮数部で表現できる数値は、1から24ビット分の16,777,215となり....

    例えば10,000,000を2進数で表すと、1001 1000 1001 0110 1000 0000 (24bit)となり、
    仮数部が埋まってしまい、小数点以下が表現出来なくないですか?
    今まで、「float = 小数」だと思っていましたが、
    数値が上がると,表現出来る小数桁が減っていくと言う事であっていますか?
  • In reply to mori:

    わわいです
    小数点以下ばかりをこだわっているようですが、ここでいう表現できる桁数、というのは、全体の桁数です。
    つまり、整数部分も含めた桁数、というのに注意してください。
    7桁表現可能という場合には、
    1234567.89
    では小数点以下は全部意味がないってことになります

    で、そもそものはなしですが、
    質問の提示の数値というのは、あくまで表示の都合で小数点以下6桁なり5桁なりにしているだけ、ですね

  • In reply to わわい:

    わわいさん、
    全て理解出来ました。
    いままで、floatというものを完全に誤解していましたし、
    全然考えずに使っていました。勉強になりました。

    >>あくまで表示の都合で小数点以下6桁なり5桁なりにしているだけ、ですね
    なるほど。分かりました。

    ありがとうございました。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page