質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

1397閲覧

Float型について

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/11/10 21:11

VisualStudio c++にてfloat型の変数に330245000代入したところ、330244992.となってしまいました。
これは桁落ちというやつなんでしょうか?
桁落ちって小数点以下で起こるものだと思っていたのですが、
floatは、有効桁数7桁とあったのですが、7桁以上は整数部分でも桁落ちするという意味なのですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
actorbug

総合スコア2231

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/12 23:57

詳細にありがとうございます! なるほど、有効数字というのは、先頭もしくは末尾に数値があった場合のことだったのですね、そのあたりがわかっていませんでした。 非常にわかりやすかったです。ありがとうございます。
guest

0

C/C++のfloatは、通常はIEEE 754 での単精度浮動小数点数の形式: binary32に書かれている形式です。

仮数部(fraction)が23ビットですが「ケチ表現」なので24ビット文の情報を持っています。
24ビットは2**24=16777216ですので、十進数で有効数字7桁までは表現できますが、16777216を超える8桁の十進数は正しく表現することはできません

投稿2021/11/11 04:44

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/11 11:29

ご回答ありがとうございます。すみません、もう少し聞きたいのですが、 floatの値の範囲は、-3.40282e+38〜3.40282e+38ですが、 例えば、3.40282e+38だと、3.40282 × 10の38乗となると思います。 そうすると、最大で表せる整数値は、33桁くらいだと思っていたのですが、 何を考えちがいをしていたのかよくわからず、floatの最大最小の整数値は何なのでしょうか? 一応33桁ほど表示はできるけど、正確性がないということなのでしょうか?
guest

0

全体で(普通の環境では)4バイトしかないので、無限桁数の整数を扱えるわけが無いです。
整数の場合と、小数部分を含んだ場合違いは、10進→2進変換での誤差が発生するかどうかの違いだけで、
整数であっても有効桁数を越えたものは正確に表現できません。

投稿2021/11/11 02:13

otn

総合スコア84804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

有効桁数7桁とあったのですが、7桁以上は整数部分でも桁落ちするという意味なのですか?

YES. float/doubleの内部表現は(整数値であっても)一律 1.□□□□ × 2^△△ の形に正規化されます。
□□□□部分は固定長なので有効桁数には限りがあります。

投稿2021/11/10 23:04

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

7桁以上は整数部分でも桁落ちするという意味なのですか?

「桁落ち」は別な現象に対する名前ですが、浮動小数点数は整数であっても精度には限界があります。

投稿2021/11/10 21:50

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問