[英]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
所以我想提出任何建议:是否有对结果进行四舍五入的“最佳实践”,或者是否有更智能的方法来计算对数? 非常感谢!
对于基数 10,您应该使用:
math.log10(x)
它返回 x 的以 10 为底的对数。 这通常比 log(x, 10) 更准确。
也许您可以使用容差来解释计算错误。 例如这样的事情(您可以根据所需的精度调整所需的 10 次幂)
abs(math.log(1000,10))-3 >= -1e-6
使用 numpy 我也有np.log10(1000) = 3.0
。 您可以将其用作替代方案。
您会看到浮点数值的不精确性,这是您无法完全规避的计算系统的基本限制。 两种标准做法是:(1) 增加数字精度(例如float64
),或 (2) 通过阈值进行比较:
float64
上运行,并且是用于数值计算的最快的 Python 库(甚至比 C 还快)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
作为输出
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.