代码之家  ›  专栏  ›  技术社区  ›  Ayush Chuarasia

python数学。在较大int时记录不准确的输出?

  •  2
  • Ayush Chuarasia  · 技术社区  · 7 年前

    我尝试了大部分方法来解决不准确的日志,但我的代码似乎没有任何效果:

    num = 810333333333333333253432343224234
    print(num)
    getcontext().prec = 100 # set the precision  (no. of digits)
    getcontext().rounding = ROUND_DOWN  # this will effectively truncate
    logA = Decimal(math.log(num,2))
    
    print(logA)
    #find num using component of logs
    seedfrac = Decimal(logA - int(logA))
    nonfrac = 2**int(logA)
    frac = Decimal(2**seedfrac)
    print(Decimal(frac*nonfrac))
    #find num directly 
    print(Decimal(2**logA ))
    

    810333333333333333253432343224234
    109.320214523928456173962331376969814300537109375
    810333333333340688230991571062453.5576735355138989553226940926052307835750320132600744995177525695124
    810333333333340688230991571062453.5576735355138989553226940926052307835750320132600744995177525695128
    

    如果您知道任何解决方法,请回复,谢谢。

    1 回复  |  直到 7 年前
        1
  •  7
  •   DSM    7 年前

    math.log Decimal(math.log(num,2)) 你只是在转换结果时调用十进制 num

    首先将数字转换为十进制实例,保持精度,然后使用其对数方法之一(为了可读性,在下面插入换行符):

    In [22]: Decimal(num)
    Out[22]: Decimal('810333333333333333253432343224234')
    
    In [23]: Decimal(num).ln()
    Out[23]: Decimal('75.77499847546938418941086142055648421904630259496362044
                      157156139031463040418047508186428539214239394')
    
    In [24]: Decimal(num).ln().exp()
    Out[24]: Decimal('810333333333333333253432343224234.0000000000000000000000
                      000000000000000000000000000000000000000000020')
    
    In [25]: Decimal(num).ln() / Decimal(2).ln()
    Out[25]: Decimal('109.32021452392844307936383214097698765413874994582696830
                      23528366628242511675596034347551786781907708')
    
    In [26]: 2**(Decimal(num).ln() / Decimal(2).ln())
    Out[26]: Decimal('810333333333333333253432343224233.999999999999999999999
                      9999999999999999999999999999999999999999999548')