硬核解析:小米计算器1÷(1-1)输出"∞"这对吗?

起初是在一个春晚魔术《惊喜定格》的解密视频下面有人贴出了小米计算器的问题:

1÷(1-1) = ∞;

1÷0=不能除以0

左右计算结果不同

我们做了几组测试,结果如下:

几组测试用例结果

黑盒测试的结果很明显:只要除数是通过函数或表达式计算为 0 的,结果就显示为 ∞。

显示为∞的原理

在确认问题之前,先来了解为什么会出现∞

在小米计算器的除法逻辑中,如果除数一开始就是确切的 0,则输出“不能除以 0”。

其他情况则走实数计算路径,底层使用的是 CR 库

此处不讨论有理数分支情况

反编译代码定位

在 CR 的实数计算中,如果除数为 0,会抛出 PrecisionOverflowException 错误。
计算器将该错误统一处理为 infinity(无穷大),再经过上层展示为 ∞。

不过小米应该对 com.hp.creals.CR 做过修改,因为原 CR 文档中抛出的错误是 PrecisionOverflowError,而小米使用的是 PrecisionOverflowException。

反编译代码定位

程序为什么要这样做?

显示为 ∞ 是工程思维的体现。

我们不妨先抛开 CR 库,以更常见的浮点数标准 IEEE 754 为例来理解。(需要说明的是,小米计算器在此处并非直接使用 IEEE 754,但其工程思维是相通的。)

a / 0 = INF(a 为非 0 实数)

INF - INF = NaN

INF表示无穷大

NaN表示未定义

在 IEEE 754 下,不仅 a / 0 的结果是 INF,INF 和 NaN 还可以继续参与运算

这种设计保证了计算过程的连贯性,避免处处都需要判断除数是否为 0。

而且因为 INF 和 NaN 都可以参加后续运算(是的,INF也能加减乘除),这使得计算结果可以传递到最终数据上

因为 INF 和 NaN 可以传递到最终结果,研究人员一看便知哪组数据出了问题,既可选择忽略,也可回溯定位。

关键在于,整个系统运算速度快、代码健壮,没有堆积如山的 if 分支,也避免了因除 0 异常捕捉不到位而导致的崩溃。

除以 0 得到 ∞ 的实际应用

试想一下,一个用于气象模拟系统,运算规模高达数亿次。

开发人员不可能为每一个潜在的除法运算都预先判断除数是否为零——因为除数本身往往是复杂表达式的结果,静态分析几乎不可能全覆盖。

如果某一时刻,在一系列浮点运算后恰好出现除数为 0,系统若因此抛出异常或中断,可能导致长达数小时的计算前功尽弃。

此处仅为说明工程思维的动机,不代表实际就是这么做

因此,在工程实践中,让计算“能继续下去”,并让异常结果(如 ∞ 或 NaN)在最终数据中保留和传递,往往比“严格遵循数学定义而中断计算”更具实际意义。

研究人员可以事后根据结果中的 ∞ 或 NaN 回溯问题,而不必承担计算中断的代价。

计算器显示为 ∞ 是否合理?

从普通用户和数学严谨性角度看,这样显示不合理。

在实数体系中,除以 0 是未定义的。显示为 ∞ 既不符合数学认知,也容易导致推理上的混乱

但从工程思维角度看,问题更为复杂。IEEE 754 的设计之所以被认为是工程上的典范,不仅在于它定义了 a/0 = ∞,更在于它完整定义了 ∞ 和 NaN 的后续运算规则(如 ∞/∞ = NaN),形成一个自洽的体系。

而小米计算器的做法是:在除零时输出 ∞,但当 ∞ 参与后续运算(如 ∞/∞)时,却没有遵循这一规则——实际测试结果显示仍为 ∞,而非 NaN。(如下图)

这个结果令人诧异

这意味着小米计算器只借用了“∞”的符号,却没有完整实现工程思维背后的运算体系。这种“半工程思维”的设计,既无法在数学上自圆其说,也无法在工程上真正发挥 ∞ 和 NaN 的价值(如让异常结果传递、便于回溯定位)。

因此,小米计算器的这一设计,无论从数学严谨性还是工程完整性来看,都难称合理。

参考资料(#替换为.)

The constructive reals as a Java library

www#sciencedirect#com/science/article/pii/S1567832604000736

com.hp.creals.CR

www#hboehm#info/new_crcalc/com/hp/creals/CR.html

IEEE 754 

ieeexplore#ieee#org/document/8766229

文末藏个小知识:

js完全遵循IEEE 754规范,所以在浏览器 F12 控制台里

输入 1/0 会得到 Infinity

输入 0/0 会得到 NaN

输入 (1/0)/(1/0) 会得到 NaN

更多游戏资讯请关注:电玩帮游戏资讯专区

电玩帮图文攻略 www.vgover.com