繁体   English   中英

如何在不使用 math.log 的情况下在 Python 中计算对数

[英]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) 通过阈值进行比较:

  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作为输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM