2014-03-04 28 views
1

我寫了一個crule1.py,如下所示。Python的一個奇怪的計算結果

def exp_rule1 (mu1, h, alpha): 
    return h**2/(4*mu1**2) 

然後我在解釋器中運行它。我得到

Python 2.7.6 |Anaconda 1.9.1 (64-bit)| (default, Nov 11 2013, 10:49:15) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 

Imported NumPy 1.8.0, SciPy 0.13.3, Matplotlib 1.3.1 
Type "scientific" for more details. 
>>> import crul1 as c1 
>>> c1.exp_rule1(1, 1, 0) 
0 

然後我將代碼複製到解釋器。結果是

>>> def exp_rule1 (mu1, h, alpha): 
...  return h**2/(4*mu1**2) 
... 
>>> exp_rule1(1, 1, 0) 
0.25 

這讓我很困惑,我無法修復它。非常感謝您在此代碼中指出問題。

+2

這兩個實例運行python 2? – M4rtini

+0

定義「解釋器」。你在'import cru1 as c1','c1.exp_rule1(1,1,0)'line的同一個shell中運行第二個? – delnan

+0

是的,我運行相同的shell。該版本是Python 2.7 –

回答

0

問題是你混合整數和浮游物。嘗試撥打電話exp_rule1(1.0, 1.0, 0.0),您會得到正確的結果。只要確保函數的所有參數都是浮點數。

+0

非常感謝。 –

+1

但這兩種情況似乎都以相同的方式混合整數和浮點數,不是嗎? – delnan

+0

具體來說,你在做整數除法而不是浮點除法。對於整數,1/2是零,對於浮動是0.5。 – Hooked

2

在Python 2.x中,/返回一個整數值,如果它的兩個操作數都是整數。作爲一種特殊情況,如果n < dn/d都爲0,則兩者都是正數。

對於

def exp_rule1 (mu1, h, alpha): 
    return h**2/(4*mu1**2) 

要確保無論分子或分母是一個浮點值。一個簡單的方法是將4設置爲float而不是整數。

def exp_rule1 (mu1, h, alpha): 
    return h**2/(4.0*mu1**2) 

另一種解決方法是導入爲/新的3.x的行爲,這是始終返回浮點操作數無關。如果你這樣做,取而代之的是用//代替你依賴整數除法的任何部分。

# This allows 1/2 to return 0.5 instead of 0 
from __future__ import division 
+0

謝謝。這非常有用。 –