【问题标题】:Math.log wrong results for big numbers [duplicate]Math.log 大数字的错误结果[重复]
【发布时间】:2019-04-24 19:37:26
【问题描述】:

math.log2math.log 给了我一些高数字的错误结果,通过在线 py 解释器和本地机器进行了测试。

>>>print(2**72)  

>>>4722366482869645213696 #Correct

>>>math.log2(4722366482869645213697)

>>>72.0 #Wrong

>>>math.log(4722366482869645213697,2)

>>>72.0 #Wrong

>>>math.log2(39614081257132168796771975174)

>>>95.0 #Wrong

>>>print(2**95)

>>>39614081257132168796771975168 #Correct

我是遗漏了什么还是它的一些错误?

【问题讨论】:

  • 为什么 72.0 “错误”?你想要什么花车?
  • Hey.72.0 建议它与 2**72 相同而不是它,它应该返回类似于 71.xxxxxxxxx 的内容。
  • 您的问题是关于检查整数是否是 2 的幂。下次你问的时候,包括你的问题的背景和你试图解决的问题。同时,看看我的回答。

标签: python-3.x algorithm math


【解决方案1】:

实际答案大约是72.0000000000000000000003

绝对误差小于该范围内的浮点误差,您得到的floating point approximation 是计算机可以存储的最接近的log2(72) 64 位浮点数。

如果你想检查一个整数是否是2的精确幂,那么你可以检查它是否只有最左边的位是1。

if 1 << (x.bit_length() - 1) == x:
    print("x is a power of 2")

【讨论】:

  • 以及如何在 math.log 中使用十进制?它似乎默认返回结果为浮点数。
  • 您将找到该问题的答案here。不过,你真的需要这样的精度吗?
  • 找不到任何适用于我的例子的东西,我需要完美地判断数字是否是 2 在如此高的数字上的幂,所以我想我需要这样的精度。
  • 你的输入总是整数吗?对于整数,您可以简单地检查只有最左边的位是 1。我在答案中添加了这个
  • 非常聪明,谢谢!
【解决方案2】:

您错过了 math.log 为您提供的 IEEE floating point 最多 52 位精度。

您的答案在表示的范围内是正确的。

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多