2013-07-10 46 views
5
Ben Decimal için güç hesaplamak istediğiniz

yılında Ondalıklar için güç hesaplanması:gibi Python Python

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

Üstü Decimal('2)

nasıl Decimals için güç hesaplayabilirsiniz olarak beni dönmelidir? DÜZENLEME

:

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

StackTrace: Bu i

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

x ne yaptığını, ondalık tip

ama ifadesi yukarıdaki deci_x gibi hata atıyor

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, tamsayı olmayan değerlerle '**' kullanamazsınız. Matematik modülünden 'pow' işlevini kullanarak aşağıdaki çözümlere bir göz atın. – danodonovan

+0

@danodonovan - Ama sorun şu ki pow uyguluyorum, hassaslığım azalır ... –

+0

Python 3'te.4, "Ondalık" bir "güç" fonksiyonuna sahiptir – danodonovan

cevap

8

Sen ** kullanarak gücünü hesaplayabilirsiniz:

2**3 # yields 8 

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

Güncelleştirmeniz ardından, benim için tamam görünüyor: Python

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

Yardımlarınız için teşekkürler. Lütfen düzenlenmiş sorumu kontrol et. –

0

> = Decimal olarak 3.4 bir power function sahiptir. Veya math modülünü kullanarak;

from math import pow 
pow(2, 2) 

kullanarak ondalık sayılar

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

ve tamsayı olmayan ondalık sayılar da

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

'>>> timeit.timeit (" pow (a, b) ", kurulum =" math import pow; decimal import 'den decimal; a, b = Ondalık ('10'), Ondalık ('123') ", sayı = 1000) 0.009331226348876953' Bu, ** için ** 0,0093 ** >>>> timeit.timeit ("a ** b", setup = "math import pow; decimal import on decimal; a, b = Ondalık ('10'), Ondalık ('123') ', sayı = 1000) 0.031520843505859375' Bu ** 0.0315 * için \ * \ *** – HennyH

+0

@HennyH yay hızı! – danodonovan

3

Sadece Ondalığa ile güç operatörü ** kullanabilirsiniz çalışacak ...

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

düzenle ... Sorunuzun Sen Onlu() için sokmaları ayrıştırmak gerekmez

için takibi

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

Yardımlarınız için teşekkürler. Lütfen düzenlenmiş sorumu kontrol et. –

0

Python 2.4.6 Ondalıklar için tamsayı olmayan güçler desteklemez. decimal.py yılında __pow__ yöntemle Gönderen:

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') eğer bir üs olarak kullanmadan önce tamsayı türü dönüştürmek, her zaman bir tam sayıdır. Tamsayı olmayan bir üsle ihtiyacınız varsa, Python'un daha yeni bir sürümüne yükseltmeyi düşünün.