【发布时间】:2021-07-23 17:30:23
【问题描述】:
Python math.log(x,base) 功能在结果中给出了一个微小的错误,这破坏了我的功能。我正在尝试解决一个问题,我需要获取一个数字可以达到的索引,使其小于定义的边界
即,对于a**i < boundary,我想知道“i”的最大可能值,其中“a”和“边界”作为输入提供。 i 和 'a` 是整数
为了得到 i 的最大值,我写了以下逻辑:
max_i = int(math.log(boundary-1,a))
这种逻辑在多种情况下都失败了。例如:a = 56 和 boundary = 175617,max_i 应该是 3,因为 56**3(56 的 3 次方)是 175616(比给定边界小 1)。以下是相同的证明
>>> math.log(175616,56)
2.9999999999999996
>>> 56**3
175616
因为这个微小的差异max_i 变成了 2 而不是 3。如何解决这个精度问题?我尝试按照某些论坛中的建议将 a 和边界转换为浮点数,但这似乎并没有改变结果
编辑:抱歉,我忘了提到我已经写了一个与蒂埃里评论类似的快速修复程序。我正在检查是否有办法通过在包级别提出修复来摆脱浮点操作
【问题讨论】:
-
你肯定会遇到这样的浮点问题,因为它们的精度有限,所以你必须考虑到这一点;例如,您可以检查
boundary而不是boundary-1,并通过计算a**max_i来检查您以这种方式找到的max_i是否太大。 -
@ThierryLathuille 我确实在我的代码中添加了这个作为快速修复,这样可以避免破坏功能,并且很抱歉在我的问题中没有提到相同的内容。没有其他方法可以解决这个问题吗?
-
你用可以
math.ceil()? -
@nobleknight 只会解决这种情况,其余所有正常情况都会失败,请再次检查问题说明
-
然后使用
round()
标签: python python-3.x logarithm exponent