2013-07-10 12 views
5

voglio calcolare il potere per Decimal in Python come:potenza di calcolo per i decimali in Python

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

Sopra di me dovrebbe ritorno, Decimal('2)

Come posso calcolare la potenza per Decimals?

EDIT: Questo è quello che ho fatto

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

x, deci_x sono di tipo decimale

ma soprattutto espressione sta gettando errore come:

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

Stacktrace:

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 non è possibile utilizzare '**' con valori non interi. Dai un'occhiata alla soluzione qui sotto usando la funzione 'pow' dal modulo' math'. – danodonovan

+0

@danodonovan - Ma il problema è che se applico pow la mia precisione sarebbe ridotta ... –

+0

In python 3.4, 'Decimal' ha una funzione' power' – danodonovan

risposta

8

È possibile calcolare la potenza usando **:

2**3 # yields 8 

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

Dopo l'aggiornamento, sembra bene per me:

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

Grazie per il vostro aiuto. Si prega di controllare la mia domanda modificata. –

0

In Python> = 3.4 come Decimal ha un power function.

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

O semplicemente utilizzando il modulo math;

from math import pow 
pow(2, 2) 

utilizzando i decimali

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

e decimali non interi funzionerà anche

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

'>>> timeit.timeit (" pow (a, b) ", setup =" da math import pow; da decimal import Decimal; a, b = Decimal ('10 '), Decimal (' 123 ') ", numero = 1000) 0,009331226348876953' Questo è ** 0,0093 per pow ** '>>> timeit.timeit (" a ** b ", setup =" dall'importazione matematica pow; dall'importazione decimale decimale; a, b = Decimale ('10 '), Decimale (' 123 ') ", numero = 1000) 0.031520843505859375' Questo è ** 0.0315 * per \ * \ *** – HennyH

+0

@HennyH yay speed! – danodonovan

3

si può semplicemente utilizzare l'operatore di potenza ** con decimale ...

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

Modifica, followup alla tua domanda

Non è necessario analizzare punture di decimale() ...

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

Grazie per il vostro aiuto. Si prega di controllare la mia domanda modificata. –

0

Python 2.4.6 non supporta poteri non interi per i decimali. Dal metodo __pow__ in decimal.py:

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

se x-deci_x+Decimal(str(n))-Decimal('1') è sempre un numero intero, convertirlo nel tipo integer prima di utilizzarlo come esponente. Se hai bisogno che l'esponente sia un non intero, considera l'aggiornamento a una versione più recente di Python.

Problemi correlati