小数のデジタル表現

小数のデジタル表現 ワークシート
STEP 1 2進数で小数を表す仕組み
小数点の右側は「2のマイナス乗」で表す!

整数部分は 2¹・2²・2³… と増えていきましたが、
小数点の右側は 2⁻¹・2⁻²・2⁻³… と小さくなっていきます。
2⁻¹ = 1/2 = 0.5、2⁻² = 1/4 = 0.25、2⁻³ = 1/8 = 0.125 …と続きます。
10進数の各ビットの重み(整数部分 + 小数部分)
10³
3
×1000
10²
2
×100
10¹
9
×10
10⁰
1
×1
.
10⁻¹
8
×0.1
10⁻²
7
×0.01
10⁻³
2
×0.001
10⁻⁴
1
×0.0001
10進数の小数の値: 3291.8721

2進数の各ビットの重み(整数部分 + 小数部分)
1
= 8
0
= 4
1
= 2
2⁰
0
= 1
.
2⁻¹
1
= 0.5
2⁻²
0
= 0.25
2⁻³
1
= 0.125
2⁻⁴
0
= 0.0625
10進数に変換: 1010.1010 = 8 + 2 + 0.5 + 0.125 = 10.625
例題:2進数 11.01 を10進数に変換する
1
各ビットの重みを確認する
1 × 2¹ = 2
1 × 2⁰ = 1
(小数点)
0 × 2⁻¹ = 0  ← 0.5 × 0 = 0
1 × 2⁻² = 0.25 ← 0.25 × 1 = 0.25
2
全部足す
2 + 1 + 0 + 0.25 = 3.25
2進数 11.01 = 10進数 3.25
2のマイナス乗(小数の重み)早見表
2⁻¹ = 1/2 = 0.5
2⁻² = 1/4 = 0.25
2⁻³ = 1/8 = 0.125
2⁻⁴ = 1/16 = 0.0625
2⁻⁵ = 1/32 = 0.03125
入試対策 10進数の小数を2進数に変換しよう
変換のルールは 「小数部分を2倍して、整数部分(0か1)を取り出す」 を繰り返すだけ!
取り出した整数を上から順番に並べると2進数の小数になります。
1
小数部分に×2
小数部分だけを
2倍する
2
整数部分を
取り出す
「1」か「0」
3
残りの小数で
繰り返す
小数部分が0になるか
必要桁数まで
4
上から順に並べる
取り出した0/1を
小数点以下に書く
【例①】0.625 を2進数に変換
STEP①  0.625 × 2 = 1.25 整数部分「1」を取り出す
STEP②  0.25 × 2 = 0.5 整数部分「0」を取り出す
STEP③  0.5 × 2 = 1.0 整数部分「1」→ 小数部分が0になったので終了
STEP④ 0.101 小数点の右に上から順に並べる
✅ 答え
0.101(2進数)
確認:1×(1/2) + 0×(1/4) + 1×(1/8) = 0.5 + 0 + 0.125 = 0.625 ✓

【例②】0.1 を2進数に変換(無限に続く場合)
STEP①  0.1 × 2 = 0.2 0
STEP②  0.2 × 2 = 0.4 0
STEP③  0.4 × 2 = 0.8 0
STEP④  0.8 × 2 = 1.6 1
STEP⑤  0.6 × 2 = 1.2 1
STEP⑥  0.2 × 2 = … ← STEP2と同じ数が出た! → 以降は繰り返し
⚠️ 循環小数になる場合
0.1(10進数)は2進数にすると 0.0001100110011…無限に続く循環小数になります。
コンピュータは桁数が限られているため、誤差が生じます(これを「丸め誤差」と言います)。
📌 ポイント
・10進数小数から2進数小数への変換手順:
 小数部分に×2 → 整数部分(0か1)を記録 → 残りの小数で繰り返し → 上から並べる
・10進数では「きれいな小数」でも、2進数だと循環小数になる場合がある
・コンピュータで小数を扱うと誤差(丸め誤差)が発生することがある
STEP 2 固定小数点数
固定小数点数 = 小数点の位置が固定

普段使っている小数の表現方法。
仕組みが単純でわかりやすく、処理が速いのが特徴です。
  固定小数点数
メリット ・仕組みがシンプルで理解しやすい
・処理速度が速い(ハードウェアで効率よく計算できる)
・誤差が少ない(精度が一定)
デメリット ・桁が大きくなると多くのビット数が必要になる
・表せる数の範囲が狭い
(限られたビット数では絶対値が大きい数・小さい数を表現できない)
・整数部分・小数部分のビット数が固定なので柔軟性が低い
STEP 3 浮動小数点数
浮動小数点数 = 小数点の位置が移動

固定小数点数では表しにくい非常に大きな数や非常に小さな数も表せる表現方法。
正規化して、1.○○○○ × 2指数の形でよく使われます。
仕組み(10進数)
−12500
元の数
符号
×
1.25
仮数(かすう)
×
10⁴
指数
−12500 = −1.25 × 10⁴(10進数の科学的記数法)
2進数でも同じ考え方!(32ビット)
32ビット浮動小数点数の構造
符号部
1 ビット
0 = 正(+)
1 = 負(−)
指数部
8 ビット
小数点を何桁
移動させるかを表す
(2のべき乗)
仮数部
23 ビット
数の有効数字部分
(1.xxxxx の形)
符号部(1bit)+ 指数部(8bit)+ 仮数部(23bit)= 合計32bit
浮動小数点数の考え方(2進数版)
コンピュータの世界には「+」や「-」の記号がありません。
その代わりに、データの一番左の1マス(先頭ビット)を符号専用として使い、
0 か 1 で表現します。

浮動小数点数は次の形で数を表します:

符号 × 仮数 × 2指数

例)10進数の 5.5 を浮動小数点で考える:
5.5 = 101.1(2進数)= 1.011 × 2²
→ 符号:0(正)、仮数:1.011、指数:2
符号(正の数/負の数)
符号:0 → +(正)
符号:1 → -(負)
  浮動小数点数
メリット ・非常に大きな数・非常に小さな数を表せる(幅広い範囲)
・小数点の位置が動くので、様々な大きさの数に対応できる
デメリット 丸め誤差(表現できない数がある)が生じる
・固定小数点より処理が複雑(演算コストが高い)
入試対策 正規化してみよう!
正規化とは、仮数の整数部が必ず「1」になるよう、
小数点の位置を移動させて指数を調整することです。
統一した形式にすることで、コンピュータが効率よく・正確に数を管理できます。
【例】2進数 101.01 を正規化する
元の数:  101.01 小数点の位置に注目
①小数点を左に移動  101.01 1.0101  小数点を左に2つ移動
②指数を決める  小数点を左に2つ移動 ×2² を補う
③正規化後の形   1.0101 × 2²
✅ 正規化の確認
元の数 101.01 = 1×4 + 0×2 + 1×1 + 0×(1/2) + 1×(1/4) = 5.25(10進数)
正規化後 1.0101 × 2² = 1.0101 × 4 = 5.25(10進数) ✓ 値が同じことを確認!

正規化後の各部分の意味
パーツ 正規化後の値 意味・ポイント
符号 0 正の数 → 0
指数 2 小数点を左に2つ動かしたため、× 2²
仮数 1.0101 整数部が必ず「1」(正規化の条件!)
正規化のルール:小数点をどっちに動かす?
小数点を左に移動する場合
元の数が 1xx.xxx のように
整数部分が2桁以上あるとき
→ 指数はプラスになる
例:101.01 → 1.0101 × 2+2
小数点を右に移動する場合
元の数が 0.001xx のように
整数部分が0のとき
→ 指数は マイナスになる
例:0.0101 → 1.01 × 2−2
📌 ポイント
・正規化=仮数の整数部が「1」になるように調整すること
・小数点を左にN個移動 → 指数は +N、右にN個移動 → 指数は −N
・正規化しても元の値は変わらない(表現の形が変わるだけ)
STEP 4 固定小数点数 vs 浮動小数点数 まとめ比較
比較項目 固定小数点数 浮動小数点数
小数点の位置 固定 移動
表せる数の範囲 狭い 非常に広い
精度(誤差) 誤差が少ない・一定 丸め誤差が生じやすい
処理速度 速い やや遅い(複雑)
構造の複雑さ シンプル 複雑(符号・指数・仮数)
STEP 5 丸め誤差・桁落ち誤差・情報落ち誤差(超重要!)
コンピュータは小数を正確に表せないことがある!

2進数では10進数の小数を正確に表せない場合があります。
例えば 0.1(10進数) は2進数で表すと 0.000110011… と無限に続いてしまいます。
有限のビット数で表すためにどこかで打ち切るため、誤差が生じます。
有名な例:0.1 + 0.2 ≠ 0.3 問題
// Python で確かめてみよう
print(0.1 + 0.2)
→ 出力結果: 0.30000000000000004

print(0.1 + 0.2 == 0.3)
→ 出力結果: False ← 0.3 と等しくない!
これは 0.1 も 0.2 も2進数では 無限小数 になってしまうため、どこかで丸められた結果です。
誤差の種類を覚えよう
1
丸め誤差
2進数で表しきれない小数を切り捨て、切り上げ、四捨五入などで
近い値に丸めたときに生じる誤差。
例)3.141592 → 3.1416(小数第5位の「9」を四捨五入してより近い値に整えた)
2
桁落ち誤差
絶対値の近い2つの数の差を求めるとき、有効桁数が減って精度が落ちる現象。
例)1.000001 − 1.000000 = 0.000001(有効桁が大幅に減る)
3
情報落ち誤差
絶対値の大きく異なる数の足し算で、小さい数の情報が無視される現象。
例)1000000 + 0.000001 ≒ 1000000(0.000001が消えてしまう)
4
打ち切り誤差
無限に続く計算を途中で打ち切ることで発生する誤差。
例)3.141592 → 3.1415(小数第5位以降の「92…」をバッサリ切り捨てた)
オーバーフロー・アンダーフローも覚えよう
オーバーフロー(桁あふれ):表せる最大値を超えてしまうこと。
例)32ビット整数の最大値 2,147,483,647 に 1 を足すと −2,147,483,648 になる(符号が反転)。

アンダーフロー:浮動小数点数で表せる最小値より小さい数になってしまうこと。
例)非常に小さい数が 0 として扱われてしまう。
0.1 が2進数で無限小数になる理由
10進数の 0.1 を2進数に変換してみると…
0.1 × 2 = 0.2 → 0
0.2 × 2 = 0.4 → 0
0.4 × 2 = 0.8 → 0
0.8 × 2 = 1.6 → 1
0.6 × 2 = 1.2 → 1(また繰り返しに…)
0.0001100110011…(無限に繰り返す!)

これは10進数の 1/3 = 0.333… と同じで、「割り切れない」のです。
練習 やってみよう!
【基本】2進数と10進数の小数変換
① 2進数の 0.1(2進)を10進数に直すと?
(2⁻¹の重みに注目)
② 2進数の 0.01(2進)を10進数に直すと?
(2⁻²の重みに注目)
③ 2進数の 0.11(2進)を10進数に直すと?
(2⁻¹ + 2⁻² = ?)
④ 2進数の 10.1(2進)を10進数に直すと?
⑤ 2進数の 11.01(2進)を10進数に直すと?
⑥ 2進数の 101.101(2進)を10進数に直すと?
(整数部:4+1、小数部:0.5+0.125)
【応用】固定・浮動小数点数の理解
⑦ 小数点の位置があらかじめ固定されている表現方法を何という?
⑧ 小数点の位置が変わり、非常に大きな数や小さな数も表せる方式を何という?
⑨ 浮動小数点数で、符号部が「0」の場合、+(正)か -(負)どっち?
⑩ 浮動小数点数で、負の数を表現するときの符号部は?(数字で答えよう)
【発展】誤差の種類
⑪ 2進数で表しきれない小数を有限のビット数で近似するときに生じる誤差を何という?
⑫ 絶対値が近い2つの数の差を求めるとき、有効桁数が減って精度が落ちる現象を何という?
⑬ 絶対値の大きく異なる数の足し算で、小さい数の情報が無視される現象を何という?
⑭ 固定小数点数と浮動小数点数を比べたとき、表せる数の範囲が広いのはどちら?
⑮ 処理速度が速く、誤差が少ないのは固定小数点数と浮動小数点数のどちら?
⑯ 浮動小数点数で表せる最大値を超えてしまうことを何という?
まとめ ポイントを確認しよう
.
2進数の小数
小数点右は2⁻¹・2⁻²…
0.5・0.25・0.125…
全部足して10進数に
|
固定小数点数
小数点位置が固定
速くて誤差少ない
表せる範囲が狭い
~
浮動小数点数
符号・指数・仮数
IEEE 754が国際標準
広い範囲・丸め誤差あり
!
3つの誤差
丸め誤差
桁落ち
情報落ち
0.1の問題
0.1は2進数では
無限小数になる
0.1+0.2≠0.3の原因
オーバーフロー
最大値を超えた場合
アンダーフローは
最小値を下回った場合
テストで出るポイント
・2進数の小数は 2⁻¹=0.5、2⁻²=0.25、2⁻³=0.125… の重みで計算できる
固定小数点数(小数点固定・高速・範囲狭)と浮動小数点数(小数点可変・範囲広・誤差あり)の違いを説明できる
・浮動小数点数は 符号部・指数部・仮数部 で構成されることを知っている
丸め誤差・桁落ち・情報落ち の違いと原因を説明できる
0.1 が2進数で無限小数になり、0.1+0.2≠0.3になる理由を説明できる
オーバーフロー・アンダーフロー の意味を知っている
eduseful / 小数のデジタル表現
タイトルとURLをコピーしました