2014-03-04 4 views
1

다음과 같이 crule1.py를 작성했습니다.이상한 계산 결과 파이썬

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)'줄과 같은 쉘에서 돌리고 있습니까? – delnan

+0

예, 동일한 쉘을 실행합니다. 버전은 Python 2.7 –

답변

0

문제는 정수와 수레를 혼합하는 것입니다. 전화 exp_rule1(1.0, 1.0, 0.0)을 시도하면 올바른 결과를 얻을 수 있습니다. 함수에 대한 모든 인수가 부동 상태인지 확인하십시오.

+0

대단히 감사합니다. –

+1

그러나 두 경우 모두 정수와 수를 섞는 것처럼 보입니다. 그렇지 않습니까? – delnan

+0

특히, float 나눗셈 대신 정수 나누기를 수행하고 있습니다. int의 경우 1/2은 제로, float의 경우는 0.5입니다. – Hooked

2

파이썬 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) 

또 다른 솔루션에 관계없이 항상 피연산자의 float를 반환하는 것입니다 /에 대한 새로운 3.X 행동을 가져 오는 것입니다. 이렇게하면 정수 나누기에 의존하는 모든 부분을 //으로 바꿉니다.

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

감사. 매우 유용합니다. –