【问题标题】:Error in precision of python math.log(x,base) resultpython math.log(x,base) 结果的精度错误
【发布时间】: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 = 56boundary = 175617max_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


【解决方案1】:

如果您只想快速解决问题,您可以在其中添加一个额外的检查:

if base**(max_i+1) <= limit:
    max_i = max_i + 1

这只是检查比您的整数值大一的数字是否也满足条件,如果满足,则替换初始值。轻松摆脱这个浮点错误:)

【讨论】:

  • 谢谢,我已经实现了一个类似于@Thierry 评论的快速修复。如果您知道无需额外破解即可解决的解决方案,请告诉我
  • 如果您采用了不同的解决方案,请将您的解决方案添加为答案并接受适当的答案,这样我们都可以从集体智慧中学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多