"数"有两层含义:数学上它是什么(数的分类),和计算机怎么存它(数的表示)。这两者经常被混淆。
数(Number)
│
├── 实数(Real Number)— 数轴上能画出来的所有数
│ │
│ ├── 有理数(Rational Number)— 能写成两个整数之比的数
│ │ ├── 自然数(Natural Number):0, 1, 2, 3, ...
│ │ ├── 整数(Integer):..., -2, -1, 0, 1, 2, ...
│ │ └── 分数(Fraction):1/3, 2/5, -7/4, ...
│ │
│ └── 无理数(Irrational Number)— 不能写成分数的数
│ ├── 代数无理数:√2, √3, ...(方程的解但不是分数)
│ └── 超越数:π, e, ...(不是任何整系数方程的解)
│
└── 复数(Complex Number)— 实数的扩展
├── 实部 + 虚部:a + bi
├── 纯虚数:i, 2i, -3i(实部为 0)
└── i = √(-1)(虚数单位)
数轴上每一个点都对应一个实数。实数的关键特性:连续、无间隙。
数轴:
...── -2 ── -√2 ── -1 ── 0 ── 1/3 ── 1 ── √2 ── π ── 4 ──...
| 类型 | 定义 | 小数形式 | 例子 |
|---|---|---|---|
| 有理数 | 能写成 p/q(p, q 为整数) | 有限小数或无限循环小数 | 1/3 = 0.333..., 1/4 = 0.25 |
| 无理数 | 不能写成分数 | 无限不循环小数 | π = 3.14159..., √2 = 1.41421... |
实数无法解决 x² = -1 这种方程,于是数学家引入了 虚数单位 i(i² = -1),将数扩展到复数域。
复数 = 实部 + 虚部 × i
例:3 + 4i(实部 3,虚部 4)
复数在电气工程(交流电路分析)、信号处理(傅里叶变换)、量子力学中不可或缺。
自然数 ⊂ 整数 ⊂ 有理数 ⊂ 实数 ⊂ 复数
1,2,3 -1,0,1 1/3,0.25 π,√2 3+4i
每一层都是上一层的"子集"——范围越来越大。
计算机只有有限的内存位(bit),所以不可能精确表示所有数学上的数,必须做取舍。
同一个数可以用不同的进制表示:
| 进制 | 英文 | 基数 | 数码 | 示例 |
|---|---|---|---|---|
| 二进制 | Binary | 2 | 0, 1 | 101 = 5 |
| 八进制 | Octal | 8 | 0-7 | 0o15 = 13 |
| 十进制 | Decimal | 10 | 0-9 | 255 |
| 十六进制 | Hexadecimal | 16 | 0-9, A-F | 0xFF = 255 |
进制转换(以 13 为例):
十进制 13
= 8 + 4 + 1
= 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 二进制 1101
# Python 进制转换
n = 255
bin(n) # '0b11111111'(二进制)
oct(n) # '0o377'(八进制)
hex(n) # '0xff'(十六进制)
# 反向转换
int('1101', 2) # 13
int('ff', 16) # 255
| 数学概念 | 计算机类型 | 存储方式 | 精确? |
|---|---|---|---|
| 自然数 | 无符号整数(uint) | 纯二进制 | 精确 |
| 整数 | 有符号整数(int) | 补码二进制 | 精确 |
| 有理数 | 浮点数(float)/ 分数(Fraction) | IEEE 754 / 分子分母 | 近似 / 精确 |
| 无理数 | 浮点数(float) | IEEE 754 | 永远不精确 |
| 复数 | 复数(complex) | 两个浮点数 | 近似 |
关键认知:无理数在计算机中永远只能近似表示。π 的二进制是无限长的,任何有限位数的存储都只能截断。
计算机用补码(Two's Complement) 存储有符号整数:
8 位有符号整数(范围 -128 ~ 127):
正数:直接存二进制
5 → 00000101
负数:取反加一
-5 → 00000101 → 取反 11111010 → 加一 11111011
最高位是符号位:0 = 正,1 = 负
# Python 查看整数的二进制
bin(5) # '0b101'
bin(-5) # '-0b101'(Python 用符号表示,不直接显示补码)
# 手动看补码
(-5) & 0xFF # 0xFB = 251(8位补码的无符号值)
bin((-5) & 0xFF) # '0b11111011'
详见 浮点数 笔记。简要回顾:
float32: [1位符号] [8位指数] [23位尾数] → ~7 位有效数字
float64: [1位符号] [11位指数] [52位尾数] → ~15 位有效数字
Python 内置 complex 类型,用两个 float64 存储实部和虚部:
z = 3 + 4j
z.real # 3.0(实部)
z.imag # 4.0(虚部)
abs(z) # 5.0(模 = √(3²+4²))
import cmath
cmath.phase(z) # 0.9273...(辐角,弧度)
同一个数在不同进制下,可能是有限小数,也可能是无限循环小数:
| 十进制 | 二进制 | 十进制有限? | 二进制有限? |
|---|---|---|---|
| 0.5 | 0.1 | 是 | 是 |
| 0.25 | 0.01 | 是 | 是 |
| 0.1 | 0.0001100110011... | 是 | 否(无限循环) |
| 0.2 | 0.0011001100110... | 是 | 否(无限循环) |
| 1/3 | 0.0101010101... | 否 | 否 |
这就是浮点精度问题的根源:很多十进制中的"简单小数"(如 0.1),在二进制下是无限循环的,float 只能截断存储。
# 验证
from decimal import Decimal
Decimal(0.1) # Decimal('0.1000000000000000055511151231257827021181583404541015625')
# 0.1 在 float64 中的真实存储值,不是精确的 0.1
数学世界 计算机世界
───────── ─────────
自然数 1, 2, 3... → uint8/uint16/uint32(精确)
整数 ..., -1, 0, 1 → int8/int16/int32(精确,补码)
有理数 1/3, 0.25 → float(近似)/ Fraction(精确)
无理数 π, √2, e → float(近似,永远不精确)
复数 3+4i → complex(两个 float,近似)
理解这个映射关系,是理解计算机中所有数值计算的基础。
| 中文 | 英文 | 含义 |
|---|---|---|
| 实数 | Real Number | 数轴上所有的数 |
| 有理数 | Rational Number | 能写成分数的数 |
| 无理数 | Irrational Number | 不能写成分数的数 |
| 复数 | Complex Number | 实数 + 虚数 |
| 虚数 | Imaginary Number | 含 i 的数 |
| 自然数 | Natural Number | 0, 1, 2, 3... |
| 整数 | Integer | 正整数、零、负整数 |
| 分数 | Fraction | 两个整数之比 |
| 超越数 | Transcendental Number | 不是代数方程解的无理数(如 π, e) |
| 进制/数制 | Numeral System / Radix | 表示数的方式(二/八/十/十六) |
| 补码 | Two's Complement | 计算机存储有符号整数的方式 |
| 浮点数 | Floating-point | IEEE 754 科学计数法表示小数 |
| 定点数 | Fixed-point | 小数点位置固定的表示方式 |