☰
无理数、实数完备性与浮点精度:从√2到数值计算
2026/10/29 21:17:07 网站建设 项目流程

实数系里最容易被糊弄过去的一课,就是无理数。中学阶段它往往只占两行定义——“无限不循环小数叫无理数”——然后考两道判断对错的题就翻篇了。可只要你往后走一步,无论是极限、连续性、微积分,还是做数值计算、写浮点代码,都会被这个概念反复绊住:为什么有理数明明在数轴上密密麻麻,还是要被“补”成实数?为什么“稠密”不等于“连续”?为什么证明√2不是分数要用反证法而不能直接算?这些问题的答案,恰恰藏在无理数身上。我写这一篇,是给两类人看的:一类是正在学实数体系、被定义绕晕的学生,一类是当年学过但只记住结论、现在想把它彻底理顺的自学者和从业者。整篇围绕实数与无理数展开,从数系的裂缝讲到判别方法、从十进制表示讲到手工逼近、从常见误区讲到它在极限和浮点数里的落地影响,全部按可操作的顺序铺开,能直接照着推、照着算。

1. 先把概念摆正:实数这栋楼里,无理数到底是哪块砖

1.1 从“数得出来的量”到“填满一条线”的观念切换

人类最早认识的都是能写成分数的量。把一根绳子对折三次,每段是整体的八分之一;把三块饼分给四个人,每人四分之三块。这类量有个共同点:拿同一把尺子去量,总能找到某个足够细的单位,使得被量的长度和尺子长度都是这个单位的整数倍。这个“共同单位”的存在性,就是有理数在几何上的原始含义——可公度。

裂缝出现在最朴素的地方。一个边长是1的正方形,画一条对角线,这条对角线的长度就没法用分数写出来。用今天的话说,它和对角线的比是√2,而这个√2不属于有理数集合。这个发现之所以震动,不是因为它“算不出来”,而是因为它破坏了当时“万物皆可公度”的信念:世界上居然存在两段长度,无论你换多细的尺子,都量不尽。

观念切换的关键在于把“数”从“量出来的结果”改造成“数轴上的点”。一旦承认数轴是一条完整的、没有针眼大小空隙的直线,那么每一个位置都必须有一个数站在那儿,不能因为写不出分数就空着。实数就是这样的“占位全体”,有理数只是其中一小撮。这个视角非常重要,后面讲稠密性、完备性都建立在它上面:数轴不是由有理数“拼起来”的,有理数只是洒在数轴上的一层沙,沙子再密,缝里依然是空的。

1.2 有理数的三个等价面孔,以及它们各自暴露的裂缝

同一个对象可以从三个角度描述,搞清楚这三张面孔,很多混淆会自动消失。

描述角度定义形式暴露的问题
代数形式能写成 p/q,p 为整数,q 为非零整数形式隐含“约分”这个操作,很多人证明时忘记互质条件
小数形式有限小数或无限循环小数“循环”这个判据要证明,不是定义本身
数轴形式可公度的长度对应的点直观但不精确,容易误以为“密”等于“满”

第一张面孔最容易上手,第二张面孔最容易误解。很多人把“无限不循环小数”当成无理数的定义,其实那是刻画,是结论。定义是无理数即不是有理数的实数,或者用分数形式否定式地写:不能表示为两个整数之比。凡是从“不循环”出发做证明的,基本都会卡住,因为你没法直接验证一个无限长的东西“从不循环”。

第三张面孔最危险。它在直觉上给人一种“有理数差不多把数轴占满了”的错觉。要打破这个错觉,只需要一个事实:把有理数按某种顺序全部排成一列(这叫可数),再把实数也试着排,是排不完的。有理数到处都是,但它只是可数个点;数轴上的点是不可数无穷多。换句话说,你随手往数轴上扔一根针,扎到有理数的概率是零。

1.3 两种定义路径:否定式定义与构造式定义,别把它们搞反

讲无理数必须交代清楚,教材上其实混用了两条路线。

第一条是否定式,也是最省事的:先有实数系,再定义有理数,剩下的全叫无理数。这条路线的优点是干净,缺点是循环——你得先承认实数存在。中学阶段就是用这个,因为不讲实数构造。

第二条是构造式:先用整数造出有理数,再用某种技术手段把“缺失的点”补上,得到的整体才叫实数,补进去的那些点就是无理数。常见的技术手段有两种思路:一种是把有理数切成左右两堆,保证左边每个数都小于右边每个数,并要求这个切法不产生最大最小的边界,每一个这样的切法就定义一个实数;另一种是把收敛到一处的有理数列打包成一个对象,用它来代表那个“应该存在但还没存在”的极限。前者偏静态,后者偏动态,后者在讲极限时更顺手。

两条路线带来的结果一致,但思维习惯差别很大。走否定式路线的人,容易把无理数当成“奇怪的例外”;走构造式路线的人,会把无理数当成“补齐后必然产生的主体”。实测下来,凡是把第二条路线的精神吃透的人,理解极限、连续、开覆盖这些后续概念都明显轻松,因为他早就习惯了“先有位置,再谈数值”的思维方式。

顺带说一个常见的名词误会:有理数里的“有理”和“合理”毫无关系,这个词来自“比”,本义是“可写成比的数”。早期翻译按音借意,落成了现在这个名字,结果制造了大量“为什么它有理”的哲学式困惑。知道这个来源,至少能省下几次无谓的纠结。

2. 无理数为什么非存在不可:三条硬理由,从几何到分析

2.1 几何理由:对角线不可公度的完整推理

前面提了正方形对角线,这里把它推到底,因为这条推理是整座大厦的起点。

假设存在一个共同单位,使得正方形边长和对角线都是它的整数倍,记边长 = a 个单位,对角线 = b 个单位,a、b 是正整数。由勾股关系,b² = 2a²。现在看这个等式的奇偶性:右边是偶数,所以 b² 是偶数,故 b 是偶数,写 b = 2c。代回去得 4c² = 2a²,即 a² = 2c²,同理 a 也是偶数。

矛盾出现了:a 和 b 都是偶数,那么我们可以把单位放大一倍重新计数,得到更小的整数对。这个过程能无限重复下去,意味着正整数可以无限缩小——不可能。所以最初的假设错,对角线不可公度。

这条推理的精髓不在计算,而在“无穷递降”这个武器:有限的正整数不能无限变小,所以任何导致无限变小的假设都必须被推翻。这是最古老也最漂亮的一类反证。后面讲√n、讲三次根,用的都是它的变体。

值得指出的是,这个结论直接否定了“所有长度都能用分数表示”这个前提出发的整个测量体系。任何以“总能找到足够细的单位”为隐含假设的论证,都必须重新检查。

2.2 代数理由:方程在有理数里无解,逼着数系扩张

从数系演化的历史看,每一次扩张都是因为“方程解不出来”。

自然数里,x + 3 = 1 无解,于是有负数和整数。整数里,2x = 1 无解,于是有分数和有理数。有理数里,x² = 2 无解,于是必须有无理数。这条线索一路能连到复数:x² + 1 = 0 在实数里无解,于是扩张到复数。

这个视角的价值在于,它给出了判断“某个数是不是必须新增”的标准方法:看它是哪个整系数方程的解。如果它是某个整系数多项式方程的根,它叫代数数;√2 是 x² − 2 = 0 的根,所以它是代数数。反过来,不是任何整系数多项式方程的根的数,叫超越数,π 和 e 属于这一类。这个区分不是文字游戏,它对应两种完全不同难度的证明:证明√2 无理只需要三行奇偶性,证明 π 无理需要拿积分构造一个函数族,技巧性强得多。

还有一个非常实用的结论:如果整系数多项式的最高次项系数是 1,那么它任何有理根都必须是整数。拿 x² − 2 来说,有理根只能从 ±1、±2 里挑,代进去都不成立,于是它没有有理根,√2 只能是无理数。这条判据表面上绕了一圈,实际用起来比直接反证还快,尤其是在处理 √n 这类问题时几乎是秒杀。

2.3 分析理由:有理数在极限运算下不封闭

这条理由最容易被忽略,但它才是实数系真正的存在理由。

考虑一个有理数列:1,1.4,1.41,1.414,1.4142,……每一项都截取到有限位小数,所以每一项都是有理数。这个数列显然是“往一处挤”的:相邻两项的差越来越小,任意给定一个精度,总能找到某一项之后所有项之间的差都小于这个精度。这种性质叫柯西性。

问题来了:它挤向的那个点,不在有理数集里。也就是说,有理数集里有一个“洞”,一个由有理数自己指出来却填不上的洞。如果你只用有理数做分析,那么“数列收敛”这件事就失去了保障——你永远不能确定它的极限是不是还在你的世界里。

这件事的后果比想象中严重。微积分里几乎每个定理都依赖“极限存在”:闭区间上连续函数必有最大值、介值定理、中值定理,它们的证明核心都是“取一个极限点,然后在这个点上做文章”。如果极限点可能落到集合外面,整个证明链条就断了。实数系的完备性,说的就是这件事被彻底解决:任何柯西列都收敛,极限一定还在集合里,不再有洞。

必须强调一个极易混淆的区分:稠密性和完备性是两码事。有理数在实数里稠密——任取两个实数,中间一定夹着有理数;但有稠密性的集合完全可以不完备,有理数本身就是反例。反过来,完备的集合也不一定稠密,比如整数集在实数里就不稠密。把这两个词混用,是初学阶段最常见的硬伤之一,很多错误证明都是从这儿长出来的。

3. 判别与证明:怎么确认一个数到底是不是无理数

3.1 反证法的标准套路,把√2 完整走一遍

这套流程值得背下来,因为它是模板。

第一步,假设反面成立:√2 = p/q,其中 p、q 是正整数,且已经约到最简,也就是两者没有公因数。

第二步,两边平方并整理:p² = 2q²。

第三步,做奇偶性推断:p² 是偶数,故 p 是偶数,写 p = 2k。

第四步,代回:4k² = 2q²,即 q² = 2k²,同理 q 是偶数。

第五步,收口:p、q 都是偶数,与“最简”矛盾。

第六步,宣布假设不成立,√2 是无理数。

六个步骤里,最容易被跳过的是第一步的“最简”条件。少了这个条件,第四步推出 q 是偶数之后根本没有矛盾可言,证明就废了。这是我在批改时见到频率最高的漏洞,十份错解里有七份是漏写互质。写证明时把“不妨设 p、q 互质”这半句显式写出来,是个能救命的好习惯。

另一个细节是第三步:从“p² 是偶数”推“p 是偶数”,这一步依赖整数的基本性质,不是想当然。如果你要写严谨版本,可以补一句:若 p 为奇数,则 p² 为奇数,与 p² 为偶数矛盾。加上这半句,整条推理就无懈可击了。

3.2 从√2 推到√n 与高次根,一个判据通吃

很多人以为每个根都要单独证一遍,其实不用。

统一判据是这样的:设 n 是正整数,如果 n 不是完全平方数,那么 √n 是无理数。证明可以沿用反证法,也可以走“首一整系数多项式的有理根必为整数”这条路:√n 是 x² − n = 0 的根,若它是有理数则必为整数;而两个相邻整数平方之间不会再有平方数,n 又不是完全平方,所以它不可能是整数,于是只能无理。

再往上一层,m 次根也照样处理:x^m − n = 0 的有理根必为整数,只要 n 不是整数的 m 次幂,根就无理。这个结论覆盖面极大,几乎能解决所有“根号下是不是无理数”的判断。

这里必须点出一个高频错误:√4 = 2,是有理数;√9 = 3,也是有理数。所以“带根号就是无理数”这句话是错的。正确的说法是:化简之后如果根号里还留着不能开尽的整数因子,才无理。同理,√2 × √2 = 2 是有理数,√2 + (−√2) = 0 也是有理数——无理数集合对加减乘除完全不封闭,任意两个无理数做运算,结果是什么都有可能,必须逐个分析。

一个更细的坑:√2 + √3 是无理数,但这不是“显然”的。要证明它,先假设它等于有理数 r,两边平方得 5 + 2√6 = r²,于是 √6 = (r² − 5)/2 成了有理数,与 √6 无理矛盾。这类“平方后制造新的根号”的技巧,在处理根式和差时非常管用。

3.3 难啃的骨头:π 和 e 的无理性思路长什么样

这两个数的证明不属于入门范围,但知道思路有好处,至少能明白难度差在哪。

e 的处理相对温和。用它的级数表示,假设 e = p/q,两边乘以 q!,会得到“整数 = 整数 + 一个严格介于 0 和 1 之间的量”这种荒谬结构。核心思想是:把无穷级数截断,尾项的规模可以精确估计,估计出来的上界小于 1,而等式左边必须是整数,整数不可能落在 (0,1) 里。

π 的处理更硬。历史上用过一种思路:构造一个辅助函数,它的高阶导数在特定点上取整数值,再对它做多次分部积分,得到一个“整数等于一个很小的正数”的矛盾。整个过程的技术难点在于设计那个辅助函数,让它同时满足“导数值整”和“积分值小”两个要求。

我提这两条不是要你现在就会证,而是想说明一件事:无理性的证明难度差异极大,从三行到三十页都有。所以遇到判断某数是否无理的题,先看它是不是方程的根,是的话走代数判据;如果不是(超越数),基本不会要求你现场证明,最多考结论和性质。

3.4 人工构造的怪例:看着随机,其实是被设计出来的

有一类数专门用来打破直觉。比如这样构造:小数点后第 1 位放 1,第 2 位放 1,第 6 位放 1,第 24 位放 1,也就是在第 n! 位放 1,其余全放 0。这个数显然不循环——1 之间的间隔越来越长,长到你没法找到循环节。所以它是无理数。

更进一步,这类构造可以做到“无理但仍然是代数数之外的东西”,也就是超越数。它们的意义在于告诉人们:无理数不是稀有品种,而是可以被随意捏出来的。事实上从数量上看,超越数占了压倒性多数,那些我们熟悉的、有名字的常数反而是异类。

这也回答了一个常见的直觉困惑:为什么教材里反复出现的无理数就那么几个?因为能被写出来、能被算、能被用的数本来就少。数量的多寡和出现的频率完全是两回事。

4. 十进制表示:无限不循环这句话到底在说什么

4.1 循环节判据,以及它为什么成立

“有理数等价于有限小数或无限循环小数”这个结论,两边都要证。

从分数到小数这一侧:做长除法,每次余数都在 0 到除数减一之间,总共只有有限种可能。除的过程中余数必然重复,一旦重复,后面的商就开始周期性出现。这就证明了分数的小数展开一定循环,且循环节长度不超过除数减一。这个论证顺便给出了一个实用上界:1/7 的循环节最多 6 位,实际正好是 6 位(142857)。

从小数到分数这一侧:设 x = 0.\overline{142857},乘以 10⁶ 得 1000000x = 142857.\overline{142857},两式相减得 999999x = 142857,于是 x = 142857/999999,约分后是 1/7。这个方法通用:循环节有 k 位,就乘 10^k 再相减,分母必然是 k 个 9。若是“先不循环后循环”的混合情形,比如 0.1\overline{6},先整体乘 10 处理掉不循环部分,再按上面的套路走。

这套算法我建议每个人手推一遍,不要只记公式。推过之后你会自然发现,分母里那些 9 的来源是“位值制的进位”,理解这一点,后面遇到进制转换、遇到循环节长度问题时就不会发懵。

4.2 0.999… 到底等不等于 1

这个问题每年都能引起争论,而争论的双方往往都在用错的理由支持对的结论。

正确的算法只有一行:设 x = 0.\overline{9},10x = 9.\overline{9},相减得 9x = 9,x = 1。或者用等比级数:0.9 + 0.09 + 0.009 + … 首项 0.9、公比 0.1,和为 0.9/(1 − 0.1) = 1。

关键认知是:0.999… 不是一个“正在无限接近 1 的变量”,它是一个已经确定的实数,是那个级数的和。之所以有人觉得它“差一点”,是因为把“有限位截断”的直觉套到了无限位上。任何有限位的 0.99…9 确实小于 1,但这个序列的极限是 1,而 0.999… 表示的正是极限。

这件事还有一个更深的推论:十进制表示不唯一。任何有限小数都有两种写法,一种是结尾全 0,一种是结尾全 9。1 可以写成 1.000…,也可以写成 0.999…。所以在严格讨论中,通常约定不用结尾全 9 的那种写法,以保证表示唯一。这个约定不是文字游戏,在构造实数的严格理论里,它直接对应“分割”的两侧该如何归属的问题。

顺带解决另一个常见疑问:既然表示有歧义,那“无理数的小数展开不循环”这个判据还可靠吗?可靠。因为有歧义的只有有理数,无理数的展开是唯一的、不循环的,不存在第二种写法。

4.3 循环节能有多长,以及一个容易踩的坑

循环节长度的问题在实际计算里挺常见。基本结论是:1/p(p 为与 10 互质的质数)的循环节长度是使得 10^k ≡ 1 (mod p) 成立的最小正整数 k,这个 k 一定整除 p − 1。比如 1/7 对应 k = 6,整除 6;1/11 对应 k = 2;1/13 对应 k = 6;1/17 对应 k = 16。

坑在哪?在“看起来像循环但其实不是”和“看起来不循环其实是”这两种错觉上。

前者的典型是 0.101001000100001…,1 的个数之间隔着越来越长的 0,这个数不循环,是无理数,但它长得非常有规律。很多人凭“有规律”就判断它是有理数,这是把“人能描述”和“能写成分数”搞混了。后者比较少见于考试,但概念上要知道:一个数的前一百万位看起来完全随机,它依然可能是有理数,只是循环节特别长。判断依据从来不是“像不像”,而是“能不能写成两个整数之比”。

5. 手工逼近:把无理数真正抓在手里的四种方法

5.1 牛顿迭代:三次就到小数点后九位

方法本身很简单:要求 √2,就解方程 x² − 2 = 0,迭代式是 x ← (x + 2/x)/2。取初值 1,开始算。

迭代次数计算结果与 √2 的误差
01约 4.1×10⁻¹
11.5约 8.6×10⁻²
21.4166667约 2.5×10⁻³
31.4142157约 2.1×10⁻⁶
41.4142136约 1.6×10⁻¹²

误差的下降速度是“平方级”的:每迭代一次,正确位数大约翻倍。这就是为什么三次迭代就能拿到九位精度,而二分法要三十多次。

必须提醒一点:这个迭代对初值不敏感,只要取正数就收敛到正的平方根。但如果初值取 0,第二步会除零。取负数会收敛到负根。这些细节在写程序时是实打实的崩溃点。

5.2 连分数:逼近效率最高的整数表示

√2 的连分数展开是 [1; 2, 2, 2, …],无限循环。把它逐层截断,得到一串分数:

1/1,3/2,7/5,17/12,41/29,99/70,239/169,……

规律很好记:后一项的分子等于前一项分母的两倍加分子,分母等于前一项分子加分母。这些分数交替地在 √2 的两侧跳动,误差迅速缩小。99/70 已经精确到小数点后四位,239/169 精确到六位。

连分数的价值在于,它是“分母不太大时能做到的最好逼近”。在同样大小的分母下,没有任何分数能比它更接近目标。这个性质在数值计算、在有理逼近、在日历闰年规则的推导里都有应用。

一个实操建议:手算时挑连分数,别用小数硬凑。你可能觉得 1.414 挺好用,但 99/70 的误差比 1.414 小一个数量级,而它的分子分母都还在三位数以内。这是那种“知道了就再也不想回去”的技巧。

5.3 二分法:慢,但是逻辑上最干净的

求 √2 的过程:区间从 [1, 2] 开始,每次取中点,判断中点的平方大于还是小于 2,保留包含根的那一半。

步骤区间中点中点平方
1[1, 2]1.52.25
2[1, 1.5]1.251.5625
3[1.25, 1.5]1.3751.890625
4[1.375, 1.5]1.43752.06640625
5[1.375, 1.4375]1.406251.9775390625
6[1.40625, 1.4375]1.4218752.0217285156

每做一次,区间长度减半,大约 3.3 次能换来一位十进制精度。这个方法效率低,但它有一个其他方法没有的优点:每一步都给出一对明确的有理数上下界,把目标数“夹”在中间。这正是区间套思想的具体形态,也解释了为什么实数可以用有理数列来定义——那个极限点,就是被无限次二分夹出来的那个唯一的位置。

动手做几遍这个表,比看十遍“完备性”定义都有用。你会亲眼看到:每一步的结果都是有理数,它们指向的那个点却不在有理数里。

5.4 稠密性的直观:你在数轴上永远找不到“邻居”

拿 √2 举例。假设你找到了一个比它大的、最接近的有理数,叫它 r。那么 (√2 + r)/2 也是有理数(两个有理数的平均值),它严格介于 √2 和 r 之间,且比 r 更接近 √2,矛盾。所以“最接近的有理数”不存在。

同理,两个无理数之间也一定夹着有理数,只要间隔足够小,总能找到分数落在里面。这个过程无限进行下去,说明有理数和无理数在数轴上是真正“交错咬合”的,任何一段区间里都同时含有无穷多个有理数和无穷多个无理数。

这个结论有个很反直觉的后果:不存在“最小的正实数”,也不存在“紧挨着 1 的下一个数”。任何两个不同的实数之间都有无穷多个数。这就是连续和离散最根本的差别,也是微积分能成立的前提——如果数轴像整数那样一格一格,导数和积分都无从谈起。

6. 常见误区与排查清单:我踩过的和见别人踩过的

6.1 概念层面的六个高频错误

第一个,把“无限小数”等同于“无理数”。错,0.\overline{3} 是无限小数,等于 1/3,是有理数。判据是循环与否,不是位数多少。

第二个,把“有规律”等同于“有理数”。错,前面那个 0.101001000100001… 很有规律,但不循环,所以无理。判据永远回到“能否写成两个整数之比”。

第三个,把“开方”等同于“无理”。错,√4、√9、∛8 都是整数。必须先化简。

第四个,把“稠密”等同于“完备”。这是最需要警惕的一个,前面已经拆过,不再重复,只强调一句:有理数稠密但不完备,是最经典的反例。

第五个,把 π 当成 22/7。这只是一次近似,误差在万分之四左右,用来估算可以,写在证明里就是错误。同理,3.14 也不是 π。

第六个,以为无理数集合对运算封闭。错得厉害:√2 · √2 = 2,√2 / √2 = 1,都是有理数。两个无理数的和、差、积、商都有可能是有理数,也可能不是,必须具体情况具体分析。

6.2 证明与计算中的易错点

反证法漏写互质条件,前面说过,这是第一号杀手。补一句“不妨设 p、q 互质且 q > 0”,能省掉一半的坑。

根号运算的拆分错误:√(a + b) 不等于 √a + √b。这个错误在代数变形里天天出现,尤其在解方程两边开方的时候。要养成“先配方再开方”的习惯,别直接拆。

比较大小的时候把无限和有限混起来:0.999… 和 1 是同一个数,不能写 0.999… < 1。写成不等式的任何一步,都要先确认两边是不是已经确定下来的实数。

在证明“某数是无理数”时直接引用它的十进制不循环,这是循环论证。十进制不循环是结论,不是出发点,除非你已经在前面先证过“有理数的小数必循环”。

区间端点归属搞错:二分法求根时,如果中点的平方恰好等于 2,那就正好找到根了,此时区间缩成一个点。虽然 √2 的情形下永远不会恰好等于,但在通用的二分法代码里,这个等号判断是必须写的,不写就会陷入死循环。

6.3 一张速查表

现象是不是无理数判断依据
√2是非完全平方数的平方根
√4否化简得 2
∛2是非完全立方的三次根
0.333…否循环,等于 1/3
0.1010010001…是不循环,但需注意不是所有不循环写法都好证
π是超越数,需专门证明
√2 + √3是平方后导出 √6 为有理,矛盾
√2 · √2否等于 2
3.1415926否有限小数,本身就是有理数
1 − 0.999…否等于 0,是有理数

这张表里的最后两行值得多看两眼,它们分别对应“常数近似”和“表示歧义”两个高频混淆源。

7. 往外延一层:无理数影响了哪些地方

7.1 极限与连续性的地基

所有关于“连续”的定义,都依赖实数系的完备性。函数在一点连续,要求自变量趋近该点时函数值趋近函数在该点的值,这里的“趋近”必须能落在集合内部,不能被一个洞卡住。有理数集上,同一套定义会变得千疮百孔:某些函数在有理点上看起来哪都连续,却无法保证任何介值性质。

介值定理是最典型的受益者:连续函数在区间两端取异号的值,中间必有一个零点。证明的关键一步是不断二分区间,取端点序列的极限。这个极限如果可能落在有理数之外,定理就没法证。所以实数系的完备性不是数学家的洁癖,它是整门学科能不能运转的开关。

顺带一提,这也是“为什么不能只用有理数做数值计算”的深层原因。浮点数全是有限二进制小数,也就是有理数,他们在离散的世界里模拟连续,误差不可避免。这个问题下一节展开。

7.2 浮点数:无理数在机器里的样子

计算机里的双精度浮点数,用 52 位表示尾数,能精确表示的数全部形如整数乘以 2 的幂,也就是分母为 2 的幂的分数。所有这类数都是有理数。合起来看,浮点数能表示的数量是有限的,大约不到 2 的 64 次方个,其中只有极少数位置是有理数的代表,剩下无穷无尽的实数,一个都存不下。

所以机器处理无理数的方式只有一个:用有理数逼近。√2 被存成某个具体的二进制小数,误差在 2 的负 52 次方这个量级,约 2.2×10⁻¹⁶。这个精度对多数工程计算够用,但误差会随着运算累积,尤其在做大量加减和迭代时。

一个经典的现象:0.1 + 0.2 在双精度下不等于 0.3。原因不是 bug,是 0.1 和 0.2 在二进制里都是无限循环小数,存进去的那一刻就被截断了。解决思路通常有两个:一是用整数放大法,把金额按最小单位换算成整数再算;二是改用十进制类型。选哪个取决于业务对精度的要求和计算量的大小。

还有个反直觉的地方:判断两个浮点数是否相等,永远不要用等号,要用差值小于某个容差。因为任何一次运算都可能引入误差,等号几乎必然失败。这条经验我在不同的项目里反复确认过。

7.3 概率与几何里的意外出场

投一根针到画满等距平行线的平面上,针与线相交的概率里含 π。随机取两个整数,它们互质的概率是 6/π²。这两件事看起来毫无道理,其实是几何与数论的交叉结果。它们说明,无理数不是“数学内部的技术细节”,而是会从概率结构里自然冒出来的东西。

更日常的例子是圆周长和面积。任何与圆相关的计算,结果几乎必然带 π,也几乎所有这类结果都是无理数。这就解释了为什么工程上永远用近似值,也正是无理数的实际存在方式:我们从不真正“算完”它,只是把误差控制到可接受的范围。

7.4 自学与教学的路线建议

如果是自学,我建议按这个顺序推进,不要跳。

第一步,把分数与小数的互化练到闭眼能写,循环节长度会算。这是后面所有讨论的语言基础。

第二步,手推一遍 √2 无理的证明,不看答案,写到“漏了互质条件”为止,然后补上。这一步的目的是把反证法的模板刻进去。

第三步,用二分法和牛顿法各手算一遍 √2 到六位。目的是建立“有理数列逼近无理数”的具体感。

第四步,理解稠密性与完备性的区别,能举出反例。这一步不需要严格的构造理论,能讲清楚“有理数有洞”就够了。

第五步,再回头看极限的定义和连续的定义,你会发现以前觉得别扭的表述,其实是不得已的精确。

如果是带别人学,我的经验是先给反例再给定义。先问“√2 能不能写成分数”,让他试着写,写不出来,再问“那它到底是不是数”,这个顺序比先讲定义再讲例子有效得多。人对裂缝的敏感度,远高于对定义的记忆度。

最后分享一个我用了很多年的小练习:随便写一个无限小数,把它的前 n 位截断当成分数,看这个分数怎样一步步逼近原数,再想想这个分数序列的极限是不是原数。做完之后,你对“实数是有理数列的极限”这句话的理解,会比读十页教材都实在。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询