小数のデジタル表現
情報Ⅰ
小数のデジタル表現 ワークシート
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進数の小数の値: 3291.8721
2進数の各ビットの重み(整数部分 + 小数部分)
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進数の小数になります。
→
→
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⁴(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進数の小数
小数点右は2⁻¹・2⁻²…
0.5・0.25・0.125…
全部足して10進数に
|
固定小数点数
小数点位置が固定
速くて誤差少ない
表せる範囲が狭い
~
浮動小数点数
符号・指数・仮数
IEEE 754が国際標準
広い範囲・丸め誤差あり
∞
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 / 小数のデジタル表現