PHP 和 Lua 中的对数函数存在非单调性缺陷

如果 a > b > 1,且 x > 1,那么你可以证明:logₐx < logₐx。(提醒一下,logₐx 表示满足 x = a^t 的 t 的值。)仔细想想,这一点非常直观:对于“正常”的数值来说,a 越大,要得到相同的 x 所需的 t 就越小。

然而,如果你去问 PHP 它的看法,它会在少数几种情况下告诉你:“你错了!”

?php
$x = 2.93;
$a = 10 + 2 ** - 49;
$b = 10;
assert ( $a > $b );
var_dump ( log ( $x, $a ) < log ( $x, $b ));
var_dump ( log ( $x, $a ) == log ( $x, $b ));

需要明确的是,这并不是常见的浮点数精度误差。大家早已知道,浮点运算本身就存在精度问题,而且写博客讨论这个问题也并不有趣。

这个例子是特意设计的,旨在触发一种截然不同的结果。

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论