PHP 和 Lua 中 log 函数竟然是非单调的
来源:purplesyringa.moe — 2026-07-22
📋 概述
文章揭示了一个令人惊讶的浮点运算陷阱:在 PHP 和 Lua 中,即使 a > b > 1,log(x, a) 也可能小于 log(x, b),违反数学对数函数的单调性。这不是普通的浮点舍入误差,而是因为这些语言在实现双参数 log 时没有直接使用 libm 提供的专用函数,而是通过 ln(x)/ln(a) 间接计算,导致分子和分母都舍入到相同值后结果却不同。
🔑 核心要点
- 当 a > b > 1 时,数学上 log_a(x) < log_b(x),但 PHP 和 Lua 在某些输入下结果翻转
- 根本原因:这些语言用 ln(x)/ln(a) 间接计算任意底对数,经过两次舍入
- Python 的 math.log 产生相等结果,PHP 却产生相反的不等式,尽管 ln(a) 和 ln(b) 舍入到相同值
- 问题仅出现在底数不同但参数相同的情况;如果参数也变化,几乎所有语言都会有反例
- Rust 和 C# 没有这个问题,它们可能使用了不同的实现策略
💡 金句
这甚至不是因为 ln(a) 和 ln(b) 不同——它们舍入到了同一个浮点数!分子没变,分母没变,但结果变了。
👍 0👎 0
← 返回 Lobsters 首页