基本情報でわかる 浮動小数点 「3つの情報で1つの数を表す仕組みを知れば、浮動小数点数がわかる」


2021-03-17 更新

この連載では、基本情報技術者試験によく出題されるテクノロジー関連の用語を、午前問題と午後問題のセットを使って解説します。

午前問題で用語の意味や概念を知り、午後問題で技術の活用方法を知ってください。それによって、単なる丸暗記では得られない明確さで、用語を理解できるようになります。

今回のテーマは、 浮動小数点数 です。

浮動小数点数 / 浮動小数点 とは

たとえば、 10 進数の -3.5 を 2 進数で表すと、どうなるでしょう。 -11.1(2) です( (2) は 2 進数であることを示します)。

ただし、コンピュータの内部で、 -11.1(2) という表現を、そのまま使うことはできません。なぜなら、コンピュータの内部では、電圧の高低を 1 と 0 に置き換えた 2 進数が使われているからです。 1 と 0 しかないので、マイナス符号( – )や、小数点を示すドット( . )を表現できません。

 

今回のテーマである 浮動小数点数は、 1 と 0 だけでマイナス符号や小数点がある数を表現する方法です。いったい、どのような仕組みになっているのでしょうか?

 

1 つの数を 符号部 指数部 仮数部 という 3 つの情報に分けて示すのです。これらは、どれも 1 と 0 だけの情報です。

符号部は、プラスなら 0 で、マイナスなら 1 で表します。 -11.1(2) の符号はマイナスなので、符号部は 1 です。

11.1(2) の部分は、小数点位置をずらして

11.1(2) = 0.111(2) × 22

と変形して、 2 = 10(2) を指数部、 111(2) を仮数部とします。これで、 -11.1(2) を 1 と 0 だけで表せました。

  • 符号部が 1(2)
  • 指数部が 10(2)
  • 仮数部が 111(2)

11.1(2) = 0.111(2) × 22 と変形したのは、数の途中に小数点が入らないようにするためです。そのためには、 小数点位置をフワフワとずらすことになるので、「浮動小数点」と呼ぶのです。

仮数部の 111(2) は、実際には、先頭に 0. がありますが、 0. を省略しています。小数点位置をずらしたので、元の値と同じにするために、指数部が必要になります。

0.111(2) × 22 の × 2 の部分も基数という情報ですが、 2 進数の基数は 2 に決まっているので、「基数部」という情報を持つ必要はありません。

浮動小数点数 に関する午前問題

それでは、浮動小数点数に関する午前問題を見てみましょう。

以下は、実数(小数点のある数) aa = f × re という浮動小数点数で表現したときに、 f, e, r を何と呼ぶかという問題です(超カンタンですね!)。

問 2 (平成 21 年度 秋期)

実数 aa = f × re と表す浮動小数点表示に関する記述として,適切なものはどれか。

f を仮数, e を指数, n を基数という。
f を基数, e を仮数, r を指数という。
f を基数, e を指数, n を仮数という。
f を指数, e を基数, y を仮数という。

これまでに示した 11.1(2) = 0.111(2) × 22 という例に当てはめると、

f が仮数部、
e が指数部、
r が基数部

です。したがって、選択肢アが正解です。この問題には、符号部が登場しません。符号部は、変数で表現できないからでしょう(たぶん)。

解答

浮動小数点数 に関する午後問題 ~ 10進数に変換 ~

浮動小数点数は、 CPU のメーカーとして有名なインテルによって考案され、現在では、 IEEE 754 という規格になっています。

この規格では、符号部、指数部、仮数部を、 1 ビット、 8 ビット、 23 ビットにして、全体を 32 ビットで表す「単精度浮動小数点数」と、それぞれを、 1 ビット、 11 ビット、 52 ビットにして、全体を 64 ビットで表す「倍精度浮動小数点数」があります。これらは、私たちが普段使っているパソコンの CPU でも採用されています。

 

以下は、浮動小数点数に関する午後問題の一部を抜粋したものです。 IEEE 754 の単精度浮動小数点数がテーマになっています。単精度浮動小数点数の説明を読んでから、具体例を見て、それが 10 進数でいくつかを答える、という内容になっています。

「そんなの楽勝だよ!」と思って説明を読んでみると、「何これ?」と思うことがいくつかあるでしょう。それは、 IEEE 754 では、先ほどの午前問題で説明した浮動小数点数の仕組みに、ちょっとした工夫が加えられているからです。さらに困ったことに、その工夫が、かなり難しい表現で説明されています。ざっとで OK ですので、説明を読んでみてください。

問 1 平成 24 年度 春期 午後(一部抜粋)

浮動小数点数に関する次の記述を読んで,設問 1, 2 に答えよ。

(1)
a × 2β の形で表記される浮動小数点数を,図 1 に示す 32 ビット単精度浮動小数点形式 (以下,単精度表現という) で表現する。ここで, α と β は次の条件を満たすものとする。
α = 0, 又は 1 ≦ | α | < 2
-126 ≦ β ≦ 127
図 1 32 ビット単精度浮動小数点形式
① 符号部(ビット番号 31)
α の値が正のとき 0 ,負のとき 1 が入る。
② 指数部(ビット番号 30 ~ 23)
β の値に 127 を加えた値が 2 進数で入る。
③ 仮数部(ビット番号 22 ~ 0)
| α | の整数部分 1 を省略し,残りの小数部分が, ビット番号 22 に小数第 1 位が来るような 2 進数で入る。

ただし, α の値が 0 の場合,符号部,指数部,仮数部ともに 0 とする。

(2)
例えば, 10 進数の 0.75 を 2 進数で表すと, (0.11)2 となる。これは (1.1)2 × 2-1 と表記でき,単精度表現では,図 2 のとおり,符号部は(0)2,指数部は -1 に 127 を加えて (01111110)2 となり,仮数部は (1.1)2 の小数部分が入るので, (100・・・0)2 となる。ここで, 00・・・0 は 0 が連続していることを表す。
図 2 0.75 の単精度表現

設問 1  次の単精度表現が表す数値として正しい答えを,解答群の中から選べ。


解答群
ア 3 × 2-125  イ 3 x 2-122  
ウ 3 × 25  エ 3 × 2132
オ 11 × 2-125  力 11 × 2-122  
キ 11 × 25  ク 11 × 2132

それでは、やさしい言葉で、 IEEE 754 の単精度浮動小数点数の符号部、指数部、仮数部の仕組みを説明しましょう。ここでは、 α × 2βとしているので、 α が仮数部で、 β が指数部です。

(1)
符号部の

α が正の時 0 、負のとき 1 が入る

は、午前問題で説明したことと同じです。仮数部の α には正と負があるので、それを符号部の 0(2) と 1(2) で表すという意味です。

(2)
指数部の

β の値に 127 を加えた値が 2 進数で入る

は、午前問題で説明しなかったことです。これは、指数部にも正と負があるので、「イクセス表現(日本語では「げたばき表現」と呼ばれます)」を使うという意味です。イクセス表現は、マイナス符号を使わずに、 0 と 1 だけで負の値を示す方法です。「 2 の補数表現」という方法を聞いたことがあると思いますが、それとは別の方法です。

イクセス表現は、表せる数値の範囲の真ん中の数をゼロとみなす、という方法です。

たとえば、 1 ~ 13 ( A ~ K ) のカードを持つトランプでイクセス表現を使うなら、 1 ~ 13 の真ん中である ( 1 + 13 ) ÷ 2 = 7 をゼロとみまします。こうすれば、 1 ~ 13 で -6 ~ 6 を表せます。

単精度浮動小数点数の指数部は、 8 ビットなので、 00000000(2) ~11111111(2) の真ん中である ( 00000000(2) + 11111111(2)) ÷ 2 = 11111111(2) ÷ 2 をゼロとみまします。

2 進数の数は、 1 ビット右シフトすれば 2 で割った値になるので、 11111111(2) ÷ 2 = 01111111(2) です。 01111111(2) を 10 進数で表すと 127 です。

つまり、指数部の

β の値に 127 を加えた値が 2 進数で入る

とは、 127 をゼロとみなすという意味なのです。

これによって、 β で表せる数の範囲は、 -126 ~ 127 になります。問題の説明では、これを

-126 ≦ β ≦ 127

と示しています。

(3)
仮数部の

|α| の整数部分の 1 を省略し、残りの小数部分が、ビット 22 に小数第 1 位が来るような 2 進数で入る

は、午前問題で説明した仕組みに、ちょっとした工夫が加えられています。

午前問題では、 11.1(2) = 0.111(2) × 22 と変形して 0. を省略すると説明しましたが、 IEEE 754 では、 11.1(2) = 1.11(2) × 21 と変形して先頭の 1. を省略するのです。実際には存在する 1. を省略することで、全体で表せるビット数が 1 ビット増える、という工夫です。「ビット 22 に小数第 1 位が来る」とは、仮数部は左詰めにする、ということです。

11.1(2) = 1.11(2)×21 と変形するのですから、仮数部の α は 1 以上で 2 未満の数になります。問題の説明では、これを

1 ≦ | α | < 2

と示しています。 | | で囲んで、絶対値としているのは、 α が負の値の場合もあるからです。

なお、

α = 0 、又は 1 ≦ | α | < 2

と示しているのは、 α が 0 の場合は、 1.・・・ と変形できないので、その場合には、これも問題の説明にありますが、「ただし、 α の値が 0 の場合、符号部、指数部、仮数部ともに 0 とする」からです。

IEEE 754 の単精度浮動小数点数の仕組みがわかったところで、設問 1 を解いてみましょう。問題には、具体例として、 10 進数の 0.75 がどのように表現されるかが示されていますが、それを見なくても大丈夫でしょう。以下に、問題と選択肢を示します。

設問 1  次の単精度表現が表す数値として正しい答えを,解答群の中から選べ。


解答群
ア 3 × 2-125  イ 3 x 2-122  
ウ 3 × 25  エ 3 × 2132
オ 11 × 2-125  力 11 × 2-122  
キ 11 × 25  ク 11 × 2132

符号部
0(2) なので、正です。
指数部
00000101(2) = 5 です。ここでは、 127 を 0 とみなすイクセス表現なので、この 5 は、 5 – 127 = -122 を意味しています。
仮数部
011000・・・0(2) で、先頭の 1. が省略されているので、実際には 1.011000・・・0(2) です。

したがって、この浮動小数点数は、 + 1.011000・・・0(2) × 2-122 を表しています。

 

選択肢は、どれも小数点以下のない 10 進数になっているので、

1.011000・・・0(2) × 2-122 = 1011.000・・・0(2) × 2-125 と変形します。

1011 は、 10 進数で 11 なので、

1011.000・・・0(2) × 2-125
= 11 × 2-125

です。したがって、選択肢オが正解です。

 

解答設問 1 オ

いかがでしたか?

符号部、指数部、仮数部という 3 つの情報で 1 つの数を表現している仕組みを知ったことで、浮動小数点数をしっかりと理解できたでしょう。

この連載では、今後も、多くの受験者が苦手としている用語を取り上げて行きます。それでは、またお会いしましょう!

label 関連タグ
Q. 午前試験を
『免除』するには?
A. 独習ゼミで午前免除制度を活用しましょう。
免除試験を受けた 87% の方が、
1 年間の午前免除資格を得ています。
2022 年 上期 試験向け
コース申込を開始!
最大 10 % OFF の早割も!
info_outline
2022 年 上期 試験向け
コース申込を開始!
最大 10 % OFF の早割も!
詳しく見てみるplay_circle_filled
label これまでの『基本情報でわかるテクノロジー』の連載一覧 label 著者

『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”

大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。

主な著作物

  • 「プログラムはなぜ動くのか」(日経BP)
  • 「コンピュータはなぜ動くのか」(日経BP)
  • 「出るとこだけ! 基本情報技術者」 (翔泳社)
  • 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
  • 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数