代码之家  ›  专栏  ›  技术社区  ›  aloha Alef

当x很小时,np.exp(x)

  •  1
  • aloha Alef  · 技术社区  · 8 年前

    我尝试了以下方法:

    import  numpy as np
    
    x = -1.20831312e+05
    print np.exp(x)     # answer: x = 0.0
    print np.expm1(x)   # answer: x = -1.0
    

    4.24578... × 10^-52477 . 我怎样才能避开这件事?我需要比较一下 np.exp(x) x .

    3 回复  |  直到 8 年前
        1
  •  4
  •   Jaime    8 年前

    你必须使用对数刻度。正如@norrius所建议的,您可以简单地使用x,但如果您想将其转换为科学记数法,请尝试以下方法:

    def exp_to_sci(x):
      coeff, exp = np.modf(x / np.log(10.0))
      return 10**(coeff + 1), exp - 1
    

    如果您在您的示例中尝试,您将得到:

    >>> exp_to_sci(-1.20831312e+05)
    (4.2457778774122303, -52477.0)
    

    这和你从Wolfram那里得到的系数和指数是一样的。

        2
  •  3
  •   Paul Panzer    8 年前

    sympy bigfloat

    >>> x = -1.20831312e+05
    >>> 
    >>> import sympy as sp
    >>> sp.exp(x)
    4.24577787737720e-52477
    >>> 
    >>> import bigfloat
    >>> bigfloat.exp(x)
    BigFloat.exact('4.2457778773771979e-52477', precision=53)
    
        3
  •  0
  •   James    8 年前

    2^(1-1023) = 2^-1022

    由于您的号码可能小于此号码,因此将其存储为 0.0 .