数的世界:从数学概念到计算机表示

"数"有两层含义:数学上它是什么(数的分类),和计算机怎么存它(数的表示)。这两者经常被混淆。

第一层:数学上的数

数的家族树

数(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)(虚数单位)

实数(Real Number)

数轴上每一个点都对应一个实数。实数的关键特性:连续、无间隙。

数轴:
...── -2 ── -√2 ── -1 ── 0 ── 1/3 ── 1 ── √2 ── π ── 4 ──...

有理数 vs 无理数

类型 定义 小数形式 例子
有理数 能写成 p/q(p, q 为整数) 有限小数或无限循环小数 1/3 = 0.333..., 1/4 = 0.25
无理数 不能写成分数 无限不循环小数 π = 3.14159..., √2 = 1.41421...

复数(Complex Number)

实数无法解决 x² = -1 这种方程,于是数学家引入了 虚数单位 i(i² = -1),将数扩展到复数域。

复数 = 实部 + 虚部 × i
例:3 + 4i(实部 3,虚部 4)

复数在电气工程(交流电路分析)、信号处理(傅里叶变换)、量子力学中不可或缺。

自然数、整数、有理数、实数的关系

自然数 ⊂ 整数 ⊂ 有理数 ⊂ 实数 ⊂ 复数
  1,2,3   -1,0,1   1/3,0.25   π,√2    3+4i

每一层都是上一层的"子集"——范围越来越大。


第二层:计算机如何表示数

计算机只有有限的内存位(bit),所以不可能精确表示所有数学上的数,必须做取舍。

数制(Numeral System)

同一个数可以用不同的进制表示:

进制 英文 基数 数码 示例
二进制 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'

浮点数存储:IEEE 754

详见 浮点数 笔记。简要回顾:

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 小数点位置固定的表示方式

相关笔记