【问题标题】:Why does f(50) differ radically from f(50.0)? [duplicate]为什么 f(50) 与 f(50.0) 截然不同? [复制]
【发布时间】:2019-03-20 08:29:33
【问题描述】:

我在 Python 2.7.15 中定义了一个函数,它接受两个输入 (b,v),但我注意到 f(50,0.1) 产生的结果与 f(50.0,0.1) 的结果非常不同。这是函数:

def f(b,v):
    h=b*v/math.sqrt(1-v**2)
    def dJ_dp(J,p):
        return [J[1],-J[0]+3.0/2*J[0]**2+1/(2*h**2)]
    J0 = [0.0000001,1/b]
    ps = np.linspace(0,15,50)
    Js = odeint(dJ_dp, J0, ps)
    us = Js[:,0]
    return (ps,1/us)

我需要在f(b,v) 中定义dJ_dp,因为它需要值h。为什么输出如此不同?为什么它们完全不同?

我的假设是在定义 h 时出了点问题,但似乎并非如此。

【问题讨论】:

  • Python 2.7 为实数和整数定义了不同的除法。 Take a look
  • J0 = [0.0000001,1/b] 的第二个条目是一个整数除法,如果 b 是一个 int,即它的结果将是 0 而不是 0.02

标签: python floating-point int precision physics


【解决方案1】:

问题大概出在这里:J0 = [0.0000001,1/b]

如果b 是整数501/b 将使用整数除法完成,结果为0。如果b 是浮点数50.0,它将通过浮点除法完成,结果为0.02

您可以使用1.0 而不是1 来强制浮点运算:

J0 = [0.0000001, 1.0/b]
# Here -----------^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2012-04-14
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多