VisualStudio c++にてfloat型の変数に330245000代入したところ、330244992.となってしまいました。
これは桁落ちというやつなんでしょうか?
桁落ちって小数点以下で起こるものだと思っていたのですが、
floatは、有効桁数7桁とあったのですが、7桁以上は整数部分でも桁落ちするという意味なのですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
いきなり2進数だと難しいかもしれないので、まずは10進数で説明します。
「有効数字2桁」と聞いて、どのような数字を思い浮かべるでしょうか。
「1.2」のような数字を思い浮かべるかもしれませんが、
実は「3.4 x 10^-2 = 0.034」も「5.6 x 10^3 = 5600」も「有効数字2桁」です。
つまり、先頭または末尾2桁に数字が入っていて、それ以外の桁がすべて0のものは
すべて「有効数字2桁」となります。
さて、float型は、有効数字が「2進数で24桁」になります。
今回問題となった「330245000」ですが、2進数にすると以下のようになります。
10011101011110010001110001000
先頭から26桁まで数字が入っているので、有効数字が「2進数で24桁」のfloatでは表現できません。
先頭24桁までしか数字が入らないように「1」を削ると、以下のようになります。
10011101011110010001110000000
これを10進数にすると、「330244992」となります。
ちなみに、floatで表現可能な、次に大きい数字は「330245024」となります。
floatだと、このあたりの整数はとびとびにしか表現できないのです。
10011101011110010001110100000
投稿2021/11/11 13:54
編集2021/11/11 14:04総合スコア2399
0
C/C++のfloatは、通常はIEEE 754 での単精度浮動小数点数の形式: binary32に書かれている形式です。
仮数部(fraction)が23ビットですが「ケチ表現」なので24ビット文の情報を持っています。
24ビットは2**24=16777216ですので、十進数で有効数字7桁までは表現できますが、16777216を超える8桁の十進数は正しく表現することはできません
投稿2021/11/11 04:44
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
7桁以上は整数部分でも桁落ちするという意味なのですか?
「桁落ち」は別な現象に対する名前ですが、浮動小数点数は整数であっても精度には限界があります。
投稿2021/11/10 21:50
総合スコア145950
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/11/12 23:57