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

问题描述 投票:0回答:5

在我的代码的while循环中while中断是因为

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

但是,当然,以10为底的对数恰好是3,所以我有信心该条件应该起作用...

但实际上我有这个:

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

因此,我希望提出任何建议:是否有“最佳实践”对结果进行四舍五入,还是有一种更智能的对数计算方法?非常感谢!

python logarithm
5个回答
2
投票

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

math.log10(x)

返回x的以10为底的对数。通常,这比log(x,10)更准确。


2
投票

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

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

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


2
投票

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

  1. 您可以使用Numpy,它默认情况下在float64上运行,并且是用于数字计算的最快的Python库(甚至比C还要快)
  2. Exabs(math.log(1000,10) - eps),其中eps(ε)是一个小数字(例如1e-7

实际上,如果一次比较多个值(向量,矩阵),则Numpy会为此提供一个方便的方法:np.allclose。要进行与(2)中的比较,请设置np.allclose,然后使用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,但不是; Python自动为您简化控制台记录的表示形式。要查看实际数值,请使用Python的True

format

^这是存储在内存中的真实值,是在运行print(format(1e-5 + 1e-5 + 1., '.32f')) # print(format(1e-5 + 1e-5 + 1., '.32f')) 1.00001999999999990897947554913117 之前将1.00002转换为的值,因此它显示==


2
投票

您可以使用True检查一个值是否接近另一个值。

math.isclose

您可以这样改变您的状况

math.isclose

并获得import math print(math.isclose(3,math.log(1000,10))) 作为输出


0
投票

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

  1. 您可以使用float64,它默认情况下在Numpy上运行,并且是用于数字计算的最快的Python库(甚至比C还要快)
  2. Exfloat64,其中abs(math.log(1000,10) - eps)(ε)是一个小数字(例如eps

实际上,如果一次比较多个值(向量,矩阵),则Numpy会为此提供一个方便的方法:1e-7。要进行与(2)中的比较,请设置np.allclose,然后使用np.allclose;例如:

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 ,但不是; Python自动为您简化控制台记录的表示形式。要查看实际数值,请使用Python的(1e-5 + 1e-5 + 1.) == 1.00002

True

^这是存储在内存中的真实值,是在运行format之前将print(format(1e-5 + 1e-5 + 1., '.32f')) # print(format(1e-5 + 1e-5 + 1., '.32f')) 1.00001999999999990897947554913117 转换为的值,因此它显示1.00002

© www.soinside.com 2019 - 2024. All rights reserved.