2013-07-10 14 views
5

Chcę obliczyć moc dla Decimal w Pythonie jak:obliczania mocy dla dziesiętne w Pythonie

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

Przede powinien zwrócić mi jak Decimal('2)

Jak mogę obliczyć moc dla Decimals?

EDIT: To co zrobiłem

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

x, deci_x są typu dziesiętnych

ale powyżej wypowiedzi rzuca błąd jako:

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 nie można użyć '**' z wartościami niecałkowitymi. Spójrz na poniższe rozwiązanie, używając funkcji 'pow' z modułu' matematycznego'. – danodonovan

+0

@danodonovan - Ale problem jest, jeśli zastosuję pow, wtedy moja precyzja byłaby zmniejszona ... –

+0

W python 3.4, 'Decimal' ma funkcję' power' – danodonovan

Odpowiedz

8

Można obliczyć moc za pomocą **:

2**3 # yields 8 

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

Po aktualizację, wydaje się w porządku dla mnie:

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

Dzięki za pomoc. Sprawdź moje edytowane pytanie. –

0

W Pythonie> = 3,4 jak Decimal ma power function.

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

Albo po prostu używając modułu math;

from math import pow 
pow(2, 2) 

wykorzystujące dziesiętne

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

i dziesiętne nie całkowite będzie również pracować

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

'>>> timeit.timeit (" pow (a, b) ", setup =" from matematyka import pow; z dziesiętnego importu Decimal; a, b = dziesiętna ('10 '), dziesiętna (' 123 ') ", number = 1000) 0.009331226348876953' To ** 0,0093 dla pow ** '>>> timeit.timeit (" a ** b ", setup =" from matematyka import pow; z dziesiętnego importu Decimal; a, b = Dziesiętny ("10"), dziesiętny ("123") ", numer = 1000) 0.031520843505859375' To ** 0,0315 * dla \ * \ *** – HennyH

+0

@HennyH yay speed! – danodonovan

3

można po prostu użyć operatora energii ** z dziesiętne ...

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

Edit, nawiązanie do Twojego pytania

Nie trzeba analizować użądlenia do dziesiętnych() ...

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

Dzięki za pomoc. Sprawdź moje edytowane pytanie. –

0

Python 2.4.6 nie obsługuje uprawnień niż całkowite dla przecinku. Od sposobu __pow__ w decimal.py:

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

jeśli x-deci_x+Decimal(str(n))-Decimal('1') jest zawsze liczbą całkowitą, konwertować je do typu całkowitego przed użyciem go jako wykładnik. Jeśli potrzebujesz wykładnika, by nie był liczbą całkowitą, rozważ uaktualnienie do nowszej wersji Pythona.