2013-07-10 42 views
5

我想計算功率Decimal在Python這樣的:計算功率小數在Python

from decimal import Decimal 
Decimal.power(2,2) 

以上應該返回我作爲Decimal('2)

如何計算功率Decimals

編輯: 這就是我沒有

y = Decimal('10')**(x-deci_x+Decimal(str(n))-Decimal('1')) 

X,deci_x是小數類型

但上述表達式的拋出誤差爲:

decimal.InvalidOperation: x ** (non-integer) 

堆棧跟蹤:

Traceback (most recent call last): 
    File "ha.py", line 28, in ? 
    first_k_1=first_k(2,n-1,k) 
    File "ha.py", line 18, in first_k 
    y = Decimal('10')**(x-deci_x+Decimal(str(n))-Decimal('1')) 
    File "/usr/lib64/python2.4/decimal.py", line 1709, in __pow__ 
    return context._raise_error(InvalidOperation, 'x ** (non-integer)') 
    File "/usr/lib64/python2.4/decimal.py", line 2267, in _raise_error 
    raise error, explanation 
+0

@ Mayank Jain你不能使用具有非整數值的**。使用'math'模塊的'pow'函數來查看下面的解決方案。 – danodonovan

+0

@danodonovan - 但問題是,如果我應用pow,那麼我的精度會降低... –

+0

在python 3。4,'Decimal'有'電源'功能 – danodonovan

回答

8

可以使用**計算功率:

2**3 # yields 8 

a = Decimal(2) 
a**2 # yields Decimal(4) 

按照你的更新,似乎沒有問題啊:

>>> x = Decimal(2) 
>>> deci_x = Decimal(1) 
>>> n=4 
>>> y = Decimal('10')**(x-deci_x+Decimal(str(n))-Decimal('1')) 
>>> y 
Decimal('10000') 
+0

感謝您的幫助。請檢查我編輯的問題。 –

0

在Python> = 3.4爲Decimalpower function

>>> decimal.power(Decimal('2'), Decimal('2.5')) 

或者僅僅使用math模塊;

from math import pow 
pow(2, 2) 

使用小數

>>> pow(Decimal('2'), Decimal('2')) 

和非整數小數還將努力

>>> pow(Decimal('2'), Decimal('2.5')) 
+0

'>>> timeit.timeit(「pow(a,b)」,setup =「從數學導入pow;從十進制導入Decimal; a,b =十進制('10'),十進制('123')」,數字= 1000) 0.009331226348876953' 這是** 0.0093對於pow ** '>>> timeit.timeit(「a ** b」,setup =「from數學輸入pow;來自十進制小數; a,b =十進制('10'),十進制('123')「,數字= 1000) 0.031520843505859375' 這是** 0.0315 *爲*** * *** – HennyH

+0

@HennyH yay速度! – danodonovan

3

您可以只使用電力運營商**與十進制...

print(Decimal(2)**Decimal(2)) # 4 

編輯,隨動你的問題

你並不需要解析蜇到十進制()...

from decimal import Decimal 
x, deci_x, n = Decimal(2), Decimal(3), 4 
y = Decimal(10)**(x-deci_x+Decimal(n)-Decimal(1)) 
print(y) # 100 
+0

感謝您的幫助。請檢查我編輯的問題。 –

0

的Python 2.4.6不支持小數非整數次冪。從__pow__方法在decimal.py

def __pow__(self, n, modulo = None, context=None): 
    #[snip] 
    if not n._isinteger(): 
     return context._raise_error(InvalidOperation, 'x ** (non-integer)') 

如果x-deci_x+Decimal(str(n))-Decimal('1')總是整數,將其轉換成整數類型用它作爲一個指數之前。如果您需要將指數設置爲非整數,請考慮升級到更新版本的Python。