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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

6回答

892閲覧

C言語の浮動小数点数の範囲について

mofu_mofu

総合スコア73

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/03/12 02:28

みなさんいつもお世話になっております。

Float型とDouble型の(符号仮数指数の)範囲について疑問があるので質問をさせていただきます。

参考書に

Floatは4byte +-1.1E-38 ~ +-3.4E+38 Doubleは8byte +-2.2E-38 ~ +-1.7E+308

と書いてあったのですが、この記載の

Floatは4byte +-1.1E-38 ~ +-3.4E+38

の範囲を分解すると

-1.1E-38 ~ +1.1E-38 -3.4E+38 ~ +3.4E+38

の二つの範囲を取りうるのでしょうか?(Doubleも然り)

そうだとすると、「なんで二つの範囲があるんだろう?範囲が二つあるなら逆にわかりづらそう」って思ってしまうのですがこの理由を教えていただけないでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答6

0

K.I.S.S.

Floatの範囲

投稿2018/03/12 02:55

kazto

総合スコア7196

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

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

0

まず、C言語自体では浮動小数点数の範囲は決まっていません。もっとも、パソコンのC言語処理系ではIEEE 754の2進法記法が採用されることがほとんどなので、以下ではそれを前提に考えます。

そして、浮動小数点数は、「符号」「仮数」と「指数」の3つの要素からなっています。マイナスの値は符号だけ反転すればいいのですが、指数を小さくできる量にも限界があるので、絶対値の小さな方にも限界があります。

なので、「+-1.1E-38 ~ +-3.4E+38」は「-1.1E-38 ~ +1.1E-38」と「-3.4E+38 ~ +3.4E+38」ではなく、「-3.4E+38~-1.1E-38」と「±0」と「+1.1E-38~+3.4E+38」というような範囲となっています(0だけは別枠で用意してあります)。

投稿2018/03/12 02:56

maisumakun

総合スコア145183

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

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

0

たとえば「Floatは4byte +-1.1E-38 ~ +-3.4E+38」とは、

Floatは
-3.4E+38 ~ -1.1E-38
0.0
+1.1E-38 ~ +3.4E+38
という範囲の数が扱えるという意味です。
1.1E-38より(絶対値が)小さな数はゼロに丸められるか切り上げられて±1.1E-38になるかです。

投稿2018/03/12 02:56

a_saitoh

総合スコア702

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

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

0

Floatは4byte +-1.1E-38 ~ +-3.4E+38

これは下記を意図したものです。

Floatは4byte ±1.1E-38 ~ ±3.4E+38

復号同順というやつ。なので、あなたの解釈は誤り。

より正確には、

Floatは4byte 約±1.1E-38 ~ 約±3.4E+38 および 0 および ±∞ および 非数(NaN)

ですね。
他の方の回答にありますが、C言語の規格の話じゃなくて、メジャーな処理系の実装の話です。

注:もうすこし有効数値を長くすると、約±1.175E-38 ~ 約±3.402E+38 なので、「約±1.1E-38」とすべきか「約±1.2E-38」とすべきか難しいところです。

投稿2018/03/12 15:25

otn

総合スコア84499

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

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

0

その参考書は誤解を招きやすい書き方をしていますね。浮動小数点で表せる数値の範囲は、通常は「絶対値」で考えます。つまり、floatでは絶対値の最小値が1.1E-38、最大値が3.4E+38ということです。

浮動小数点は内部では2進数で扱っているので、10進数とはうまく合致せず中途半端な数値になることを頭に入れておかないといけません。

判りやすいように仮数4bit・指数3bitとして最大値と最小値を表すと

1111000.0 → 10進で78
0.00000001 → 10進で0.00390625

となります(たぶん)。見ての通り、整数側と小数側で全く違った値になってしまっています。

投稿2018/03/12 04:31

catsforepaw

総合スコア5938

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

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

0

記述しているのは、たんにとり得る数値の範囲なのでは?

最小値と最大値を書いてるだけだと思いますが

投稿2018/03/12 02:37

編集2018/03/12 02:38
y_waiwai

総合スコア87747

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

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

mofu_mofu

2018/03/12 02:55

y_waiwaiさん お世話になります。 よくわかっていないのであまり要領を得ていないトンチンカンな返信になってしまい恐縮なのですが、 たとえばFloatであれば、符号に1bit 仮数に23bit 指数に8bitが割り振られていて、全体で32bit(4byte)ですが、 それなら「仮数部は23bitで取りうる範囲の値2^23 = 8388608通りの任意の範囲を表すことができます」 「指数部は8bitなのでで取りうる範囲の値2^8 = 256通りの任意の範囲を表すことができます」 という風に記述するのかな?と思いました。 わざわざ仮数部を+-1.1指数部を+-38というように1.1や38と明記している理由ってなんだろう、というのが疑問です。 よろしくお願いいたします。
maisumakun

2018/03/12 02:57

「1.11111111111111111111111(2進)×2^128」なんて書かれても人間には値の範囲が把握できないので、10進法に換算してあります。
y_waiwai

2018/03/12 02:57

「浮動小数点とは」とかなんとかで、まずはぐぐってみましょう。 そんでそこにたくさん解説が出てくると思いますので、まずはそれを読んでみることです そうすれば、あなたの書いていることが的はずれだ、とわかるとおもいます
mofu_mofu

2018/03/12 03:07

改めて調べ直し整理し直してから返答させていただきます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問