在我的代码的while循环中while中断是因为
>>> 3<=abs(math.log(1000,10))
False
但是,当然,以10为底的对数恰好是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
。您可以使用它作为替代。
您正在看到float数值不精确度,这是无法完全规避的计算系统的基本限制。两种标准做法是:(1)提高数值精度(例如float64
),或(2)按阈值进行比较:
float64
上运行,并且是用于数字计算的最快的Python库(甚至比C还要快)abs(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
转换为的值,因此它显示==
。
您可以使用True
检查一个值是否接近另一个值。
math.isclose
您可以这样改变您的状况
math.isclose
并获得import math
print(math.isclose(3,math.log(1000,10)))
作为输出
您正在看到float数值不精确度,这是无法完全规避的计算系统的基本限制。两种标准做法是:(1)提高数值精度(例如True
),或(2)按阈值进行比较:
float64
,它默认情况下在Numpy上运行,并且是用于数字计算的最快的Python库(甚至比C还要快)float64
,其中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
。