ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

无理数不是补丁:从√2证明到数轴构造与工程精度

无理数不是补丁:从√2证明到数轴构造与工程精度

批改作业时看到过一句话:“π 约等于 3.14,所以 π 是有限小数,那它就是有理数。”这不是个别现象,从初中到考研复习,无理数这个概念被反复讲过,但真正被想明白的人并不多。问题出在名字上——“无理”两个字让人觉得这是一种“讲不出道理”的数,仿佛它是个例外、是个麻烦、是数学为了自洽硬塞进来的补丁。而实数体系恰恰相反:无理数不是补丁,是主体。有理数在数轴上虽然稠密,但只占“零测度”的一层薄雾,剩下几乎全部都是无理数。

这篇内容我想把“实数中的无理数”这一块彻底摊开讲:定义里到底藏了哪些容易被跳过的条件,√2 那个经典证明的每一步为什么要那样走,学生在哪个环节最容易形成错误直觉,以及在数轴上怎么把 √n 这类数真正“按”到正确位置。适合正在学这一章的初高中生、需要给学生讲清楚的老师,也适合想补一补数学底子的自学者。全程给可复现的操作和手算过程,不讲空话。

1. “无理”这个名字,从翻译开始就把人带偏了

1.1 它不是“没有道理”,而是“不能写成比”

先把最要命的一层误会拆掉。“有理数”这个词对应的英文是 rational number,词根是 ratio,意思是比、比例。所以有理数的本义是“可以写成两个整数之比的数”,无理数 irrational 的本义就是“不能写成两个整数之比的数”。中文早期翻译用“理”字对译 ratio 这个义项,翻得挺雅,但副作用巨大——整整几代学生都在潜意识里觉得“无理数是不合逻辑的数”。

这个误会带来的直接后果是,很多人的判断标准变成了“看起来奇怪的就是无理数,看起来规整的就是有理数”。于是 √4 被划进无理数(因为有根号),0.333… 被划进无理数(因为有省略号),22/7 被当成 π 的精确值,而 0.1010010001… 这种真正的不循环小数反而没人认得出来。

我给学生纠正这个点时,一般会先说一句:判断一个数是不是无理数,跟它长什么样没关系,只跟它能不能写成 p/q(p、q 为整数,q≠0)有关系。外形是给人看的,能不能写成分数是数学性质。√4 长得像无理数,但它等于 2,就是有理数;0.333… 长得没完没了,但它等于 1/3,也是有理数。

1.2 定义里的三个隐藏条件,少一个都不算数

教材上的定义通常是“无限不循环小数叫做无理数”。这句话只有十四个字,但里面压了三个条件,每一个都是必要的:

条件反例(满足该条件但不是无理数)说明
必须是小数形式2、-5、0整数都是有理数,可写成 2/1
必须是无限小数0.25、3.75、0.125有限小数一定能化成分数,0.25=1/4
必须是不循环的0.333…、0.142857142857…循环小数一定能化成分数

三条同时成立才构成无理数。这里最需要动手验证的是第三条——为什么循环小数一定是有理数。这个结论课本给得很轻,但它是整个判断体系的支点,必须自己推一遍。

拿 0.142857142857… 举例,循环节是 142857,长度 6。设 x = 0.142857142857…,两边乘 10⁶:1000000x = 142857.142857…。注意小数点后仍然是那个循环节,所以 1000000x = 142857 + x,即 999999x = 142857,x = 142857/999999。约分后正好是 1/7。这套操作对任意循环小数都成立:循环节几位就乘 10 的几次方,减掉原数,循环部分恰好抵消。

这就解释了一个反直觉的现象:无限长的东西可以是“有限的信息”。0.333… 的位数是无限的,但它的生成规则(一直写 3)是有限的,所以它能被一个分数精确表达。而 0.1010010001…(每两个 1 之间 0 的个数递增)的位数也是无限的,但它没有重复单元,无法用这套抵消法,所以它是无理数。

1.3 一个必须当心的边界:换进制后性质不变

有人会问:π 的十进制是无限不循环,那换成二进制、十六进制会不会就循环了?答案是不会。有理/无理的划分跟进制无关。理由很直接:一个数如果能写成分数 p/q,它在任何进制下都是循环或有限小数;反过来,如果它在某个进制下是无限不循环,那它就不可能写成分数。

我见过有学生试图用“换个进制试试”来绕过证明,这条路是封死的。不过有个细节值得提一句:在二进制里,1/2 = 0.1 是有限小数,而在十进制里 0.5 也是有限的;同理 1/3 在十进制是 0.333…(循环),在三进制里是 0.1(有限)。有限还是无限会随进制变,循环还是不循环也会变,但“能不能写成分数”这个本质属性永远不变。记住这一条,就不会在判断定义时被绕进去。

2. √2 那个证明:每一步都不是随便走的

2.1 先把反证法的骨架立住

√2 是无理数,这个结论人人都会背,但要求现场写证明,很多人写出来的东西是有漏洞的。完整的证明只有五六行,但每一行都有明确的合法性来源,缺一行就断链。

证法是这样的。假设 √2 是有理数,那么按照定义,存在整数 p、q(q≠0),使得 √2 = p/q。这里关键是约定 p 和 q 互质,也就是分数已经约到最简,两者除了 1 没有公因数。这一步不写清楚,后面推不出矛盾。

两边平方:2 = p²/q²,即 p² = 2q²。由此 p² 是偶数(因为它是 2 的倍数)。一个平方数是偶数,那么它本身必然是偶数——因为奇数的平方是奇数。于是 p 是偶数,可以写成 p = 2k(k 为整数)。代入得 4k² = 2q²,即 q² = 2k²。同理,q² 是偶数,q 是偶数。

到这一步矛盾就出来了:p 是偶数,q 也是偶数,那它们至少都有公因数 2,与“p、q 互质”的约定冲突。所以最初的假设不成立,√2 不能写成分数,它是无理数。

2.2 每一步的合法性,逐条过一遍

这个证明短,但里面有三个关卡,学生最容易含糊过去的地方恰好也是这里。

第一关:为什么可以假设互质?因为任何一个分数都可以约分到最简,这个过程不会改变它的值。如果 √2 能写成某个分数,那它一定能写成最简分数。所以“设为最简”不是一个额外假设,而是“设为分数”这个假设的自然结果。这一步的表述如果写成“设 √2 = p/q,且 p、q 互质”,严格来说不够严谨,更准确的说法是“设 √2 = p/q,其中 p、q 互质”——这在逻辑上等价,因为我们可以主动取最简形式。

第二关:p² 是偶数,为什么 p 就是偶数?这里用到了“奇数的平方是奇数”。奇数可以写成 2m+1,平方后是 4m²+4m+1 = 2(2m²+2m)+1,还是奇数。所以偶数平方里不可能藏着奇数,p² 偶则 p 偶。这一步在更一般的情形里会升级成“若质数 d 整除 p²,则 d 整除 p”,是数论里的基本引理。

第三关:矛盾到底出在哪?出在“互质”这个约定上。如果一开始不约定互质,p、q 都是偶数这件事根本不构成矛盾——p/q 可以是 4/2,照样等于 2。整个证明的力量来自“最简形式不允许再约”这个前提。这是反证法在这类题里最典型的用法:不直接攻击结论,而是攻击“最简”这个被约定出来的状态。

2.3 把证明迁移到 √3、√5,以及一般的 √n

掌握了上面这套,可以立刻复制到 √3。假设 √3 = p/q(最简),得 p² = 3q²,于是 3 | p²。因为 3 是质数,3 | p² 则 3 | p,设 p = 3k,代入得 9k² = 3q²,即 q² = 3k²,于是 3 | q。p、q 都被 3 整除,与互质矛盾。

同样的手法对 √5、√7、√11 全部有效。但推广到一般的 √n 时,有一个坑必须绕开:n 必须是质数,或者至少不是完全平方数。如果直接照抄“√n = p/q,则 p² = nq²,于是 n | p²,则 n | p”,这句话对合数是不成立的。

举个反例,n = 4:4 | p² 显然推不出 4 | p,取 p = 2,p² = 4,4 整除 4,但 4 不整除 2。所以合数情形下这条引理失效。

正确的推广方式是分类讨论:

  • 如果 n 是完全平方数,√n 是整数,是有理数。
  • 如果 n 不是完全平方数,则 √n 必为无理数。

后一种情形的证明需要额外处理。思路是把 n 分解质因数 n = d₁^a₁ · d₂^a₂ · … ,如果 n 不是完全平方数,那么至少有一个质因子的指数是奇数。比如 n = 12 = 2²·3,质因子 3 的指数是 1,是奇数。这时候可以断言 √12 无理。

这里还有个实用技巧:先把 n 里的完全平方因子开出来。√12 = 2√3,问题立刻归约到 √3。同理 √18 = 3√2,√50 = 5√2,√72 = 6√2。经过这一步化简,剩下的那个根号里的数必然是无平方因子的(square-free),再套证明就没有漏洞了。我批作业时特别爱看这一步,因为它同时体现了化简能力和对定理适用条件的把握。

2.4 这套证明用不到 π 身上,边界得说清楚

√2 的证明之所以漂亮,是因为它只用到了整数的整除性质。但这个方法对 π 完全无效,因为 π 根本不是“某个整系数二次方程的根”这种结构。你不能设 π = p/q 然后平方得到什么有用的信息——π² = p²/q² 只是个恒等变形,推不下去。

要证明 π 无理,得动用微积分工具,构造特定积分并证明它既是有理数又落在一个不含正整数的区间里,整个论证篇幅远超 √2。这也是为什么中学只证 √2,而 π 的无理性通常只做结论性介绍。

这里牵出一个更清晰的分层,值得早点建立:无理数里还分两类。代数数是那些能被某个整系数多项式方程“管住”的数,√2 是 x²−2=0 的根,√3 是 x²−3=0 的根,黄金比例是 x²−x−1=0 的根,它们都属于代数数。超越数则是连这样的方程都写不出来的数,π 和自然常数 e 都属于这一类。证明一个数超越,难度比证明它无理又高一个量级。学生阶段只需要建立这个分层意识,知道“无理”不是终点,后面还有更细的划分就够了。

3. 四组最容易混掉的概念,逐个拆开

3.1 无限小数不等于无理数,这是最普遍的错误

这个错误大概是最常见的,几乎每个班都有几个。原因在于教材定义把“无限”和“不循环”两个词挨在一起说,学生的记忆里就只留下了“无限”。

正确的分类是这样的:

小数形态举例是否有理
有限小数0.125、3.75、−0.4有理
无限循环小数0.333…、0.142857…、0.1666…有理
无限不循环小数0.1010010001…、√2 的展开、π 的展开无理

三类里前两类是有理数,只有第三类才是无理数。判断时不要看“长不长”,要看“有没有循环节”。

0.1666… 是个很好的例子,学生经常判错。它的循环节是 6,长度 1,所以设 x = 0.1666…,10x = 1.666…,100x = 16.666…,相减 90x = 15,x = 15/90 = 1/6。确实是分数。

而 0.1010010001… 为什么会判成无理?因为无论取多长的片段都找不到重复单元——1 后面跟的 0 的个数一直在涨。这种数没法用乘 10ⁿ 抵消的方法处理,所以它不能写成分数。

3.2 近似值不等于精确值,等号不能乱用

另一个高频问题是把 √2 直接写成 1.414。运算时这么写还能忍,写答案时这么写就是性质错误。

差别有多大?1.414² = 1.999396,离 2 差了 0.000604。也就是说 1.414 和 √2 之间差了大约 2×10⁻⁴。这个误差在中学题里可能被忽略,但在工程计算里足够把结果带偏。

正确的写法只有两种:“√2 ≈ 1.414”(约等于,保留三位小数),或者保留 √2 这个符号本身做精确运算。后者在化简时特别重要,比如 (√2 − 1)² = 2 − 2√2 + 1 = 3 − 2√2,全程保持精确;如果中间把 √2 换成 1.414,最后表达式会变成一堆小数,既难看又错。

我在讲这个点时喜欢做一个对比实验:用 1.414 而不是 √2 去算边长为 1 的正方形对角线,得到 1.414;用 √2 算得到 1.41421356…。前者的相对误差约 1.5×10⁻⁴,看起来小,但如果这个对角线是某个工程结构的尺寸,误差会被放大到不可接受。

3.3 0.999… 到底等不等于 1,本质是定义之争

这个问题每年都能吵出一堆帖子。给出结论:在实数的标准定义下,0.999… 严格等于 1,不是“约等于”,不是“无限接近”,是相等。

证明有三条路,最简洁的是一条代数法:设 x = 0.999…,两边乘 10 得 10x = 9.999…。注意 9.999… 减去 0.999…,小数点后部分完全一样,差值恰好是 9。所以 9x = 9,x = 1。

另一条路是等比级数:0.999… = 0.9 + 0.09 + 0.009 + …,这是首项 0.9、公比 0.1 的等比级数,和为 0.9/(1−0.1) = 1。

还有一条最“定义派”的路:实数就是由有理数构成的柯西序列的等价类,0.999… 和 1.000… 对应的序列差值的极限是 0,所以它们在同一个等价类里,是同一个数。

觉得别扭的人,卡点通常在“0.999… 最后一个 9 在哪里”。答案是:没有“最后”。无限小数是一个极限,不是一个“写到最后”的成品。一旦接受这个视角,0.999… = 1 就跟 1/2 = 0.5 一样平常。

顺带说一个有意思的推论:同一个实数的小数表示可能不唯一,但只在“以 9 循环”和“以 0 循环”这两个版本之间不唯一。0.5 可以写成 0.4999…,2 可以写成 1.999…。除此之外,其余实数的十进制表示都是唯一的。这也解释了为什么教材在定义无理数时要绕开这个坑——直接说“无限不循环”是有歧义的,更严格的说法是“小数展开中不出现循环节”。

3.4 稠密却“占得少”:有理数和无理数的数量对比

一个反直觉的事实:任意两个实数之间都有无穷多个有理数,也有无穷多个无理数。这叫稠密性。随便取 1 和 2 之间,中间挤满了 1.1、1.01、1.001、…… 这种有理数,也挤满了 1.1、1.01、1.001 加上一个根号微扰之后的无理数。

所以在数轴上,有理数和无理数是“你中有我、我中有你”地交织在一起的,任何一小段区间里都有无数个两种数。从稠密性上,你完全分不出谁多谁少。

但换个角度看,情况完全翻转:有理数是可数的,无理数不可数。可数的意思是能把它们排成一个序列,一个一个点名点过去,一个不漏。有理数可以这样排:把所有分数按“分子绝对值 + 分母”分组,第一组是 1/1,第二组是 2/1、1/2,第三组是 3/1、1/3……每一组都是有限的,组数也是可数的,所以整体可数。

无理数就不能这样排。用一个经典的对角线论证能说明:假设能列出所有实数,那么构造一个新数,让它的第 k 位小数与列表中第 k 个数的第 k 位不同,这个新数就与列表中每一个数都不相同,矛盾。所以实数不可数。

这两件事合起来的结论是:在“个数”意义上,无理数比有理数多得多,多到有理数几乎可以忽略不计。有理数在数轴上稠密,但它们是可数的“薄雾”;无理数是填充剩余空间的“主体”。从测度角度看,区间 [0,1] 里随机取一个数,取到有理数的概率是 0。

这个结论学生第一次听通常会愣一下,但它是理解实数连续性的关键。数轴之所以“无缝”,正是因为有那么多无理数在填缝。

4. 在数轴上把 √n 真正“按”出来

4.1 尺规构造:一步一步搭上去

无理数不是抽象的符号,它对应数轴上实实在在的一个点。把这点找出来,有一个非常干净的递推工艺。

构造 √2:在原点作一条长度为 1、垂直于数轴的线段,比如从 (0,0) 到 (0,1)。连接 (0,1) 和数轴上的点 (1,0),得到一个直角三角形,两直角边都是 1,斜边长 √2。再用圆规以原点为圆心、斜边为半径画弧,与数轴正半轴的交点就是 √2。

构造 √3:在 √2 对应的点处,向上作长度为 1 的垂线,连接原点和这个新点,斜边长为 √((√2)² + 1²) = √3。再以原点为圆心画弧落到数轴上。

构造 √n:递推规则是 √(n+1) = √((√n)² + 1²)。每一步都在上一步的斜边顶端竖一根长度为 1 的杆子,新旧两点与原点的连线长度就变成下一级。整个图案是一串套起来的直角三角形,形成一条螺旋。

这套构造有一个必须注意的细节:圆规的半径必须始终是斜边长度本身,不能取近似值。一旦中间取了近似值,误差会沿着链条累积,最后落点就偏了。尺规作图的价值恰恰在于它用精确的几何关系承载了无限小数,而不是用测量。

我让学生动手做过这个螺旋,画到 √10 左右,图案已经有模有样了。做一遍比看十遍更管用,画完之后他们对“每个 √n 都在数轴上有个家”这件事会有直观感受。

4.2 二分法:手算也能到小数点后五位

尺规解决“位置存在”,二分法解决“数值多少”。这个过程非常机械,但手算几轮后对“逼近”的理解会扎实很多。

求 √2 的过程:2 落在 1²=1 和 2²=4 之间,所以根在 (1, 2) 里。取中点 1.5,1.5² = 2.25 > 2,所以根在 (1, 1.5) 里。取中点 1.25,1.25² = 1.5625 < 2,根在 (1.25, 1.5) 中。再取中点 1.375,1.375² = 1.890625 < 2,根在 (1.375, 1.5)。继续:1.4375² = 2.06640625 > 2,取 (1.375, 1.4375);1.40625² = 1.977539 < 2,取 (1.40625, 1.4375);1.421875² = 2.021729 > 2,取 (1.40625, 1.421875)……

每一轮区间长度减半,误差上限就是区间长度。初始区间长 1,要压到 10⁻⁶ 需要约 20 轮,因为 2⁻²⁰ ≈ 9.5×10⁻⁷。这个效率不算高,但极其稳定,不会算错,非常适合手算练习。

手算时我建议用表格记录,把每一步的区间端点、中点、中点平方、与目标值的大小关系都写下来。这样做有两个好处:一是防止算乱,二是能清晰看到“区间不断收缩”这个动态过程,比直接看结论有说服力得多。

4.3 连分数:逼近速度最快的“笨办法”

如果觉得二分法太慢,可以试试连分数。√2 的连分数展开极其规整:

√2 = 1 + 1/(2 + 1/(2 + 1/(2 + …)))

记作 [1; 2, 2, 2, …]。每次截断得到的有理数叫渐近分数,它们是 √2 的最优有理逼近——在分母不超过某个数的所有分数里,它是最接近的。

数列是:1/1、3/2、7/5、17/12、41/29、99/70、239/169……

对比一下误差:3/2 = 1.5,误差 0.0858;7/5 = 1.4,误差 0.0142;17/12 ≈ 1.41667,误差 0.00245;99/70 ≈ 1.4142857,误差约 7.2×10⁻⁵。只用了一个两位分母,就达到三位小数的精度,这个效率比二分法高得多。

这个数列还有个隐藏规律:分子分母满足 p² − 2q² = ±1。检查一下:3² − 2·2² = 9 − 8 = 1;7² − 2·5² = 49 − 50 = −1;17² − 2·12² = 289 − 288 = 1。交替取 ±1,这个性质保证了 (p/q)² 和 2 的偏差是 1/q² 量级,所以逼近精度直接跟分母平方挂钩。这也是连分数高效的根本原因。

4.4 用程序验证,顺便把误差控制讲透

手算之后可以上代码验证,几行就够。二分法:

def sqrt_by_bisection(n, lo=1.0, hi=None, eps=1e-12): if hi is None: hi = max(1.0, n) steps = 0 while hi - lo > eps: mid = (lo + hi) / 2 if mid * mid < n: lo = mid else: hi = mid steps += 1 return (lo + hi) / 2, steps val, k = sqrt_by_bisection(2) print(val, k) # 1.414213562373095 约 43 步

这里有个实操坑值得提:eps 不能设得比双精度浮点的分辨率还小。双精度能提供的有效位数大约是 15–16 位十进制,如果 eps 设成 1e-18,循环可能永远退不出去,因为 mid 和 lo、hi 在浮点表示上已经重合,差值恒为 0 或某个最小值,条件判断会失效。稳妥的取值是 1e-12 到 1e-15,需要更高精度就换decimal模块。

高精度版本:

from decimal import Decimal, getcontext getcontext().prec = 50 root2 = Decimal(2).sqrt() print(root2) # 1.4142135623730950488016887242096980785696718753769

连分数渐近分数的生成:

def cf_convergents(depth): p_prev, p_prev2 = 1, 0 q_prev, q_prev2 = 0, 1 out = [] for n in range(depth): a = 1 if n == 0 else 2 # √2 的连分数系数 p = a * p_prev + p_prev2 q = a * q_prev + q_prev2 out.append((p, q, p / q)) p_prev2, p_prev = p_prev, p q_prev2, q_prev = q_prev, q return out for p, q, v in cf_convergents(8): print(f"{p}/{q} = {v:.12f} p^2-2q^2 = {p*p - 2*q*q}")

跑出来能看到 p² − 2q² 在 1 和 −1 之间交替,这个输出对理解连分数的收敛机制很有帮助。我通常把这个演示放在讲完理论之后,让学生自己改a的值去算 √3(连分数是 [1; 1, 2, 1, 2, …])、√5([2; 4, 4, 4, …]),看看不同无理数的展开形态差别有多大。

5. 真正会卡住人的地方,和一份排查清单

5.1 常见错误对照表

下面这张表是我这些年收集到的高频错误,基本覆盖了八成以上的实际问题。判断对错时对着过一遍,能省很多时间。

错误表述正确认识判断依据
无限小数就是无理数无限循环小数是有理数看有无循环节
带根号就是无理数√4、√(9/4)、∛8 都是有理数先化简再判断
π 等于 22/722/7 只是近似值,误差约 1.26×10⁻³22/7 = 3.142857…
0.999… 小于 1严格等于 1定义与级数求和
两个无理数运算后一定无理√2·√2 = 2,√2 + (−√2) = 0举反例即可
√2 + √3 等于 √5不成立,(√2+√3)² = 5 + 2√6展开验证
无理数不能比大小完全可以,√2 < 1.415 < √3用平方比较
无理数没有规律规律可以很简单,如 0.1010010001…无循环节即可

表格里最后一条值得多说两句。很多人把“不循环”误解成“随机”或者“没有规律”。其实无理数完全可以有极其简单的生成规则,0.1010010001… 的构造规则一句话就能说清,√2 的连分数展开规律到不能再规律(全是 2)。不循环是必要条件,但它约束的是“能否表示为分数”,不是“是否有简单描述”。

另外,√2 + √3 这一类问题,判断依据很硬:如果它等于某个有理数 r,那么平方得 5 + 2√6 = r²,则 √6 = (r² − 5)/2 是有理数,矛盾。所以 √2 + √3 一定是无理数。类似地,√2 · √3 = √6 也是无理数。两个无理数相加、相乘的结果,取决于具体是哪两个,不能一概而论。

5.2 可数与不可数,别讲成玄学

这个知识点在很多课堂上被一语带过,导致学生只记住一个结论,完全不知道为什么。其实用“排队点名”的比喻可以讲得很清楚。

可数的意思就是“能排队点名,一个不漏”。整数能排队:0、1、−1、2、−2、3、−3……按这个顺序点下去,每个整数都会在某个位置上出现。有理数也能排队,只是排法复杂点:把所有分数按“分子绝对值 + 分母”的和分组,和为 2 的有 1/1,和为 3 的有 2/1、1/2,和为 4 的有 3/1、1/3……每组有限,组数可数,拼起来还是一个序列。

无理数排不了队。用对角线论证:假设存在一张完整的列表,把 [0,1] 里所有实数按顺序写下去,每个数写成 0.a₁a₂a₃… 的形式。现在构造一个新数 b,让 b 的第 k 位小数取 aₖₖ 加 1(超过 9 就回到 0)。b 和列表里第 1 个数在第 1 位不同,和第 2 个数在第 2 位不同,和第 k 个数在第 k 位不同。所以 b 不在列表里,列表不完整,与“完整列表”的假设矛盾。

这个论证之所以有效,前提是“列表”本身可数。它说明实数集不能和自然数集建立一一对应,所以不可数。

学生第一次接触时最常问的问题是:“那你说不可数,到底有多少个?”这时候可以给一个“多到无法编号”的答案,然后补一句:正因为如此,你随手在数轴上取一个点,几乎必然是取到无理数。这个“几乎必然”不是修辞,是概率论意义上的——取到有理数的概率是 0。

5.3 代数数与超越数:无理数内部还分层

前面提过这个分层,这里展开说清楚,因为它能解释“为什么有的无理数好证,有的难证”这个困惑。

代数数的定义是:某个整系数多项式方程的根。√2 是 x² − 2 = 0 的根,√3 是 x² − 3 = 0 的根,(1+√5)/2 是 x² − x − 1 = 0 的根。这类数的无理性证明,本质上都在处理“整系数方程没有有理根”这件事,工具是初等的整除分析,所以中学能讲。

超越数则是“任何整系数多项式方程都拿它没办法”的数。π 和 e 是典型代表。它们的无理性证明需要更高级的工具,因为不能假设“它满足某个方程”,得从别的地方找突破口。历史上 π 的证明绕了一大圈,用了积分的性质构造反证,篇幅很长。

这个分层的实际意义在哪?在于提醒学生:“无理”是一个否定性的描述,它只说明“不能写成分数”,不说明这个数有多复杂。√2 的结构其实非常清楚,连分数展开全是 2,逼近速度极快;而有些数的性质至今研究不透。把“无理”等同于“混乱”,是把一个否定定义误当成了肯定特征。

6. 这些数在课本之外到底出现在哪

6.1 几何与工程里的固定面孔

√2 出现得比想象中频繁。任何正方形的对角线都是边长的 √2 倍,这是它最基本的来源。由此派生出很多实用场景:画等距斜线、计算对角线长度、做 45 度旋转的坐标变换,都要用 √2。

纸张规格是个很好的例子。A 系列纸的长宽比被设计成 1:√2,目的就是让“对折后比例不变”。A4 纸的尺寸是 210 mm × 297 mm,297/210 ≈ 1.4143,很接近 √2 ≈ 1.41421。这个比例不是随便定的:如果长方形长宽比为 1:√2,沿长边对折后新长方形的长宽比变成 (√2/2):1 = 1:√2,比例不变。这意味着所有 A 系列纸张形状相似,缩放排版不需要重新调整比例。

电气工程里也常见。交流电的“有效值”和“峰值”之间就差 √2 倍:正弦交流电的有效值等于峰值除以 √2。家用电压标称 220 V 是有效值,峰值大约 311 V。算器件耐压时必须用峰值,用有效值会选错元件。

圆的周长和面积公式里嵌着 π,这个不用多说。有意思的是,正态分布的概率密度函数里带着 √(2π),这个组合出现在几乎所有统计推断的公式里。做数据相关的工程时,看到 √(2π) 就知道对面在算高斯分布,不用多想。

还有一处容易被忽略:伪随机数生成。π 的十进制展开没有周期,数字分布看起来足够均匀,所以历史上真的有人拿它的数字序列当随机源用。这种做法现在基本被淘汰了(因为要从头算,效率太低),但“用无理数的展开做随机源”这个思路还活在很多地方。

6.2 精度取舍:什么时候可以取近似

最后一个实操问题:既然无理数是无限不循环的,工程里怎么用?

答案是分层处理。第一层是符号运算,全程保留根号或 π,只在最终输出时取数值。这样误差只出现一次,不会累积。第二层是中间量用高精度浮点,双精度的有效数字约 15–16 位,绝大多数工程场景够用。第三层是结果展示时按需截断,保留三到四位有效数字通常足够,因为测量误差本身就比这大。

需要警惕的是连续运算的误差累积。假设一个流程里有 10 步乘法,每步都用 1.414 代替 √2,相对误差约 1.5×10⁻⁴,十步下来可能到 1.5×10⁻³ 量级。如果这个流程最后要判断某个值是否超过阈值,误差可能导致判断翻转。

我的做法是:凡是要参与后续比较、判断、迭代的中间量,一律保留符号或至少用双精度;只有最终展示的数值才截断。这个习惯能躲掉很多莫名其妙的精度问题。顺带提一句,编程语言里的Math.PI、math.pi已经是最接近 π 的双精度浮点数,不要自己写 3.14 或 3.14159,那是在主动放弃精度。

另外,需要极高精度时(比如某些计算的验证),记得换用任意精度库,而不是调大循环次数。二分法那一段提到的浮点分辨率问题,本质原因是硬件表示能力有上限,算法再改也突破不了,只能换数据类型。

关于无理数这一块,我个人最深的体会是它在教学顺序上的错位。很多教材先讲有理数运算,再讲无理数定义,最后才讲实数体系,结果是学生先建立了一套“数=分数”的直觉,然后再被硬生生打破,重建成本很高。如果由我来安排,会在讲完分数之后立刻在数轴上埋一个 √2 的钉子,让学生早点意识到“分数不足以填满数轴”,后面的实数公理、区间套、连续性才有落脚点。另外,凡是涉及判断的题,我都要求学生写出“依据是什么”——是循环节,还是能不能化成最简分数,还是平方后能否反推出矛盾。写出依据比写对答案重要得多,因为答案可以猜,依据不能。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进