Hasty Briefsbeta

双语

Log is non-monotonic in PHP and Lua

6 hours ago
  • 作者设计了一个示例(log(2.93, 10+2^-49) 与 log(2.93, 10)),由于浮点数实现差异,该示例在 PHP 和 Lua 中产生令人意外的结果,但在 Rust 或 C# 中则不会。
  • 像 PHP 和 Lua 这样的语言通过使用专门的 log10/log2 函数来特殊处理底数为 10 和 2 的对数,以提高精度,但这与通用的 log(x)/log(base) 方法相比产生了不连续性。
  • 这种不一致性源于两种求值方法(log10 与 ln/ln)可能在不同方向上产生误差,从而打破了当 a > b 时 log(x, a) < log(x, b) 的假设。
  • 作者建议 Lua 应添加单独的 log10/log2 函数,并移除 log 中的特殊处理,但 Lua 5.2 却反向而行。PHP 的特殊处理旨在针对那些不阅读手册的用户。
  • 文中还讨论了其他边界情况,例如在 PHP 和 C# 中 log(x, 1) 返回 NaN,而在 Lua 或 Python 中则不然,以及 PHP 默认 log 中使用的 M_PI 近似值。