Bug 描述
函数中的精度损失。math.log
重现步骤
让我们试试这个函数:math.log
>>> import math
>>> let x: Float64 = 1e+5
>>> print(math.log(x))
11.512925465124336
使用 NumPy 执行相同的操作,我们得到的结果略有不同:
>>> from python.python import Python
>>> let np = Python.import_module("numpy")
>>> let truth = np.log(x)
>>> print(truth)
11.512925464970229
考虑到我们使用的是双精度浮点数,观察到的差异很糟糕(特别是因为函数无处不在):math.log
>>> let relerr = np.abs((result - truth) / truth)
>>> print(relerr)
1.3385636697732868e-11
如果我们使用“基本规则的更改”并根据 来定义,我们可以将这种差异归零:math.logmath.log10
>>> alias log10_e: Float64 = 0.43429448190325182765112891891661
>>> let alternative_result = math.log10(x) / log10_e
>>> print(alternative_result)
11.512925464970229
>>> let alternative_relerr = np.abs((alternative_result - truth) / truth)
>>> print(alternative_relerr)
0.0
系统信息
Ubuntu 22.04.2 LTS (WSL2)
mojo 0.5.0 (6e50a738)
modular 0.2.0 (355ea9c0)