【问题标题】:How to get value for 0.5^(5000) in Python3?如何在 Python3 中获取 0.5^(5000) 的值?
【发布时间】:2021-09-06 00:28:30
【问题描述】:

当前我想计算a=0.5**5000 的值。我知道a 的值很小,但我需要用a 来乘以b,其中b = 5000! 是一个很大的值。

但是当我计算a=0.5^5000的值时,结果为0。有没有人有解决这个问题的好方法?谢谢!

【问题讨论】:

  • 你的意思是a = 0.5 * 5000 ??
  • 对于.5 ** 5000,它可能会返回0.0,因为python浮点数无法显示该精度(该数字太接近于零,python无法将其与0区分开来) .在.5 ** 1074 中使用纯 python 可以获得的最低值
  • 你可以算出 2 的最大幂除以 5000 是多少!然后以封闭形式计算出乘以 0.5**5000 后剩下的 2 的幂。 justquant.com/numbertheory/…。由于这很可能是一个练习,所以也许关键是想办法在没有纯粹暴力的情况下计算答案。
  • 您需要n!/(2**n),还是将那个乘以另一个数字?可能有更好的方法来计算它。例如,n choose kn!/((n-k)!*k!),但没有人这样计算;你用((n-1) choose k) + ((n-1) choose (k-1))递归计算它。
  • 您能说明一下为什么需要这样做吗?您肯定对 5000 的 fixed 值不感兴趣! * 0.5^5000 但一些参数化的公式可以计算一些实用的东西?

标签: python python-3.x numeric largenumber


【解决方案1】:

我需要使用a 乘以b,其中b = 5000!

我只分5000! 25000 或移动它:

from math import factorial

print(factorial(5000) // 2**5000)
print(factorial(5000) >> 5000)

输出:

299375336...(more than 14000 digits)...080261230

或者正如@wim 指出的那样,fractions.Fraction 是准确的:

print(Fraction(factorial(5000), 2**5000))

输出:

958001075...(more than 14000 digits)...568359375/32

十进制是:

299375336...(more than 14000 digits)...080261230.46875

所以在这种情况下,我们只需要多出 5 位的精度,与已经超过 14000 相比并没有多少。但是例如 5!/25 它将是 3.75 而不是 3,相当很大的不同。再说一次,这个小数字(如果你也在使用它)可能对你的整体工作来说是微不足道的。我们不知道,因为你只告诉我们你尝试做你真正想要做的事情的一小部分。

【讨论】:

  • 结果实际上不是整数,所以使用//会损失精度。
  • @wim 它有 14821 位的精度。是什么让你觉得这还不够?它远远超过其他答案提供的内容。
  • 是的,我认为这还不够。当涉及阶乘时,通常是一些您真正需要精确算术的数学应用程序,所以为什么不使用Fraction(*divmod(factorial(5000), 2**5000)) 而不是使用// 截断。
  • @wim Mine 比您的Fraction(*divmod(factorial(5000), 2**5000)) 更准确faaaaar。不知道你为什么在那里做divmod :-P。但是,是的,正确的分数会更加精确。为什么我没有?没看到需要。现在 OP 接受了一个不太精确的解决方案,我仍然不接受。
  • 呃,我试图在一行上压缩它但搞砸了。 q, r = divmod(factorial(5000), 2**5000) 然后q 是你的结果,r 是余数,所以确切的结果是q + Fraction(r, 2**5000)(有趣地简化为Fraction(15, 32)!)。
【解决方案2】:

试试十进制模块:

>>> from decimal import Decimal
>>> print(Decimal("0.5") ** 5000)
7.079811261048172892385615159E-1506
>>> 

【讨论】:

    【解决方案3】:

    这是使用mpmath library 的替代答案:

    import mpmath
    
    a = mpmath.power(0.5, 5000)
    b = mpmath.factorial(5000)
    c = mpmath.fmul(a, b)
    
    print(a)
    print(b)
    print(c)
    

    这包括你提到的其他计算。

    输出:

    7.0798112610481728923856151586941e-1506
    4.2285779266055435222010642002336e+16325
    2.9937533623001661362907254353912e+14820
    

    【讨论】:

      【解决方案4】:

      使用十进制:

      from decimal import Decimal
      
      if __name__ == '__main__':
          a = Decimal(str(0.5)) ** Decimal(str(5000))
          print(a)
      
      7.079811261048172892385615159E-1506
      

      【讨论】:

      • 使用Decimal 你应该传递一个字符串,而不是float。这个浮动碰巧可以正常工作,但你不应该那样做。
      • 然后将浮点数解析为字符串,但为什么我不应该这样做?
      • 。不要那样做,传递一个字符串。看看Decimal(0.1) 会发生什么。而依赖str 就是依赖一个实现细节
      • 如果不能转换成字符串,如何计算动态值?
      • 您必须以字符串/十进制开始
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      相关资源
      最近更新 更多