← 返回首页

连分数能否终结浮点数结合律之争

发布时间: 2026-02-24 13:31(北京时间)

摘要: 作者探讨浮点数结合律问题,指出进制法因质因数限制导致精度损失,提出连分数作为有理数范围内无损表达和运算的解决方案,使用Gosper算法避免信息丢失。对于无理数,进制法和连分数都依赖截断逼近,但连分数精度提升非线性,类比位图与矢量图。强调有限空间是结合律破坏的根本原因,而非进制选择。

标签: 浮点数, 结合律, 连分数, 精度分析, 进制法, 无损运算, 数学建模, 冷静, 技术思辨

字数: 1356

原文链接: /7402396589/QtiQe7YkY

根据这几天群里激烈的讨论以及茴哥写的总结微博正文我也说下我的想法。

如果落到“浮点数结合律的问题”,那么不管使用哪种进制都会有局限性。因为进制法与质因数相关。茴哥提到的“中间结果不能丢失信息”是一种判断方式,根因是某数在某进制下分母的素因子不在进制基数里,所以被迫“无限”表示,这就存在截断和损失精度的可能性。

那不考虑工程实践,有没有一种办法可以在全体有理数范围内能保证全精度的结合律呢?我觉得“连分数”是满足的。

连分数是通过辗转相除法的逻辑来定义一个数。任意一个有理数都可以找到一个有限的序列来表达。为了简洁,通常会写成一个整数序列 x = [a0; a1, a2, a3, …] 其中a0是整数部分,而a1开始都叫做偏分母。

而Gosper算法允许两个连分数在序列上直接进行算术运算,而不需要先“计算”或者“展开”,也就是说,运算过程中是能保证“不丢失信息”的。

因为连分数能无损表达任意有理数,且使用Gosper算法可以无损进行算术运算。所以,连分数在有理数范围内关于“浮点数结合律的问题”是没有局限性的。

如果继续讨论无理数范围。进制法中本来就会试图去模拟和逼近无理数,比如在 IEEE 754 双精度格式中,尾数位总共有53bit的二进制精度。而连分数也是可以用序列去表示无理数的,只不过这个序列的元素个数是无限。那么用连分数去表示无理数的时候,也可以通过截断序列来停止“继续精确”。所以我觉得在无理数范围类,进制法和连分数也都只能做到逼近,且都看截断的长度,这方面不容易比较“好坏”。

不比较“好坏”,但是可以举个例子“感受”一下。
比方说无理数π,在 IEEE 754 双精度浮点下有53bit的尾数,换算成十进制就是总共16位的有效数字。而如果用连分数表示,序列中只要25项就可以达到前者的精度,而且继续往下扩展,每多一项对精度的贡献是非线性的。而二进制表达π的时候,每多一个bit能提供的精度提升是线性的。

如果要用图像类比,我觉得进制法更像是位图,而连分数更像是矢量图。

https://weibo.com/7884285920/Qtirb4Wrh 引文:这两天为了和群友讨论浮点数结合律的问题,我复习了一下 IEEE 754。其实 IEEE 754 也定义了十进制浮点格式,比如 IEEE 754 Decimal64,只是使用的场景比较少,一般是金融行业这类对数的十进制表示比较敏感的行业。

众所周知,在二进制中, 0.1 会被表达成一个无限小数,所以在常见的浮点数格式中, 0.1 会被存成一个和 0.1 十分接近的数,而不是 0.1 本身。 Decimal64 解决了这一经典缺陷。

但这并不意味着 Decimal64 下的加法就普遍满足结合律,因为只要运算过程中会发生某种形式的近似操作,比如舍入,比如截断,那么结合律就不一定成立。

从一般的角度看,结合律在工程实现中是否成立确实取决于参与运算的输入和中间结果能否全部被精确地表示。但,在物理空间有限的前提下,并不存在一个能精确表示所有数(包括那些在形式上为有限小数的数)的浮点系统,无论采用何种进制。进制会影响哪些数更容易或更难被精确地表示,但在“结合律会被破坏”这一点上,有限空间才是更根本的原因。