如何计算 Python 中的对数而不使用 math.log

how to compute logarithms in Python not using math.log

在我的一段代码的 while 循环中,while 中断了,因为

>>> 3<=abs(math.log(1000,10))
False

但是,当然,以 10 为基数的 1000 的对数正好是 3,所以我相信该条件应该有效...

但事实上我有这个:

>>> abs(math.log(1000,10))
2.9999999999999996 

所以我想要任何建议:是否有 "best practice" 对结果进行四舍五入或者是否有更智能的方法来计算对数? 非常感谢!

也许您可以使用公差来解释计算错误。例如这样的东西(你可以根据所需的精度调整你想要的 10 的幂)

abs(math.log(1000,10))-3 >= -1e-6

使用 numpy 我也有 np.log10(1000) = 3.0。您可以使用它作为替代方案。

对于基数 10,您应该使用:

math.log10(x)

它returns x 的以 10 为底的对数。这通常比 log(x, 10).

更准确

您将看到 浮点数不精确 在起作用,这是计算系统的基本限制,您无法完全避免。两种标准做法是:(1) 提高数值精度(例如 float64),或 (2) 按阈值进行比较:

  1. 您可以使用 Numpy,它默认在 float64 上运行,并且是最快的 Python 数值计算库(甚至比 C 还快)
  2. 例如abs(math.log(1000,10) - eps),其中eps(epsilon)是一些小数(例如1e-7

事实上,如果一次比较多个值(向量、矩阵),Numpy 有一个专门用于此的便捷方法:np.allclose。与 (2) 中的比较,设置 rtol=0,只需使用 atol;示例:

vec1 = np.array([1, 1, 1, 1])
vec2 = np.array([.33, .33, .33, .33])
print(np.allclose(vec1/3, vec2, rtol=0, atol=0.01))  # True
print(np.allclose(vec1/3, vec2, rtol=0, atol=0.001)) # False

如何查看真实值(1e-5 + 1e-5 + 1.) == 1.00002会显示True,但不是; Python 自动为您简化控制台记录的表示。要查看实际数值,请使用 Python 的 format:

print(format(1e-5 + 1e-5 + 1., '.32f'))
# print(format(1e-5 + 1e-5 + 1., '.32f'))
1.00001999999999990897947554913117

^这是存储在内存中的真实值,也是1.00002在运行之前转换成的==,所以显示True

您可以使用 math.isclose 来检查一个值是否接近另一个值。

import math

print(math.isclose(3,math.log(1000,10)))

你可以这样改变你的条件

logvalue = math.log(1000,10)
print(3 <= logvalue or math.isclose(3,logvalue))

并得到 True 作为输出