首页 > 解决方案 > 为什么 f(50) 与 f(50.0) 截然不同?

问题描述

我在 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)

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

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

标签: pythonfloating-pointintprecisionphysics

解决方案


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

如果b是 int 501/b将使用整数除法完成,并导致0. 如果b是浮点数50.0,它将通过浮点除法完成,并将导致0.02.

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

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

推荐阅读