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


2021-12-03 更新

error

この記事は基本情報技術者試験の旧制度( 2022 年以前)の記事ですが、試験対策ではなく、技術用語を理解する上では問題ないと考えています。
試験対策としてお読みになる場合は、現在の試験制度では出題されない午後問題を一部題材にしているので、ご注意ください。

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

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

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

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

たとえば、 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 を指数, r を基数という。
f を基数, e を仮数, r を指数という。
f を基数, e を指数, r を仮数という。
f を指数, e を基数, r を仮数という。

これまでに示した 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 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『基本情報でわかるテクノロジー』の連載一覧 label 著者