スポンサーリンク

問題の解答・解説ページ

このページは解説の閲覧モードです。
実力試しをしたい方は、下のボタンからクイズに挑戦してください!

この問題をクイズ形式で解く
問題 No.4135
コンピューターの数値表現において、正規化された浮動小数点数(仮数部と指数部からなる表現)を用いて計算を行ったところ、表現できる最小の正の値よりも絶対値が小さい結果となり、アンダーフローが発生した。仮数部を$23$ビット、指数部を$8$ビット持つ単精度浮動小数点数の規格において、表現できる最小の正規化された正の数値を$10$進数で表したとき、指数部が表すことのできる最も小さい値(オフセット表現による最小の指数)を $-126$ とすると、この形式で表現可能な正の最小の数値(絶対値の最小値)を表す数式として正しいものはどれか。なお、仮数部の隠しビット(ケシードビット)は $1$ とする。

【正解の解説】

$1.0 \times 2^{-126}$

浮動小数点数は「± 1.仮数部 × 2^指数部」という形式で表されます。これは定規の目盛りのようなもので、目盛りの限界を超えて小さすぎる値を表そうとしたときにアンダーフローが起きます。今回の問題では、隠しビットが1なので仮数部の実質的な数値は1.0となり、利用できる最も小さな指数が-126であるため、掛け合わせると1.0 × 2^-126がこの形式で表現できる限界の最小値となります。これは、身長を測るメジャーで1ミリ未満が測れず「これ以上測れません」とゼロになってしまう現象に似ています。

スポンサーリンク

【その他の選択肢の解説】

$1.0 \times 2^{-127}$

試験では「指数部の最小値=そのまま式の指数に使える」と勘違いさせる罠がよく出題されます。単精度浮動小数点数において指数部が表せる最も小さな値は、バイアス表現の都合上-126または-127が関わってきますが、正規化数としての限界値を作るルールでは-126が最小の指数として使われます。これをうっかり-127にしてしまうと、表現できる範囲を超えてアンダーフロー領域に突入してしまうため、正規化された数としては正しくありません。

$0.0 \times 2^{-126}$

IEEE 754などの浮動小数点数規格では、ケシードビット(隠しビット)と呼ばれる仕組みがあり、正規化された数値の整数部分は常に1であるという前提で、それをあえてビットとして保存せず省略しています。そのため、見かけ上は仮数部が0であっても、実際には「1.0」がそこに隠れているものとして計算されます。これを丸ごと「0.0」としてしまうと、数式全体がゼロになってしまい、浮動小数点数としての意味をなさなくなるため注意が必要です。

$1.0 \times 2^{-127}$

この選択肢は選択肢Bと実質的に同じ誤りを内包しており、指数部の下限値を計算する際のオフセット値の引き算を誤解した受験生を引っかけるために用意されています。浮動小数点数の規格では、すべてのビットが0の組み合わせや1の組み合わせが特殊な用途(ゼロ、無限大、非数など)に予約されているため、単純に指数部のビット表現からそのまま下限を導き出すとズレが生じます。この仕組みの本質を理解していないと、見せかけの数値に惑わされて誤った選択肢を選んでしまいます。