2016-04-01 19 views
0

Modulo ile birlikte bir güç işlemi gerçekleştirmek istiyorum. Bu pow() işlevini gerçek sayılarla gerçekleştirmede sorun yaşıyorum.Gerçek sayılar için modulo ile pow() nasıl hesaplanır?

pow(1.4142, 6000, 400) 

Ben math.pow() işlevi de denedim ama ya değil çalışır:

pow(2,6000,400) = 176 

Ancak bu gerçek sayılarla hata verir:

Bu tamsayılar için çalışıyor. .. bunu gerçek sayılarla çalışmak için nasıl alabilirim?

+0

Hangi programlama dilini kullanırsınız? –

+0

sadece VB ve Python – Amy

cevap

2

Python işlevi pow(), 2 veya 3 bağımsız değişkeni kabul eder. Sizin durumunuzda, pow(x,y,z)x gücünü y yapar ve sonuç için bir modulo z uygular. Ama documentation açıktır:

İkinci argüman negatifse, üçüncü argüman ihmal edilmelidir. Eğer z varsa, x ve y tamsayı tipinde olmalı ve y negatif olmamalıdır.

Yani: argümanlar gereksinimlerine uygun çünkü

  • İlk çağrı, gayet iyi çalışıyor. pow(2,6000)'un büyük bir sayı olmasına rağmen, birleşik modulo işleminin sonucu, tamsayıların modular exponentiation üzerindeki özellikleri kullanılarak taşma olmadan kolayca hesaplanabilir.

  • İlk çağrınız bir tam sayı olmadığından, ikinci çağrınız bir hatayla başarısız oluyor. Geçici işlem pow(1.4142,6000) % 400 içine ayrıştırmak olacaktır, çünkü modulo gerçek sayılar için tanımlanmıştır.
    Ne yazık ki, pow(1.4142,6000) çok büyük ve taşma hatasına neden oluyor. Bunun nedeni, C kayan nokta kodlaması aralığıyla real numbers are limited sınırsız aralığa sahip python tam sayılarının tersidir.

P.S. .: Ben VB's pow() sadece 2 argümanları kabul çünkü, piton ve VB hakkında olduğunu varsaydık.

Düzenleme: ipucu İşte Çözüm

teknik olarak, bir kayan nokta sayısı sınırsızdır hassas matematiksel bir gerçek değil aslında kullanan küçük geçici çözüm, ancak rasyonel bir sayı için. Daha sonra pay ve payda faydalanmak ve büyük sayılar master tamsayı işlemlerini kullanabilirsiniz:

n=pow(14142,6000)   # take the first argument multiplied by a 10 exponent to make it an integer 
d=pow(10000,6000)   # keep track of this 10 exponent 
i=n//d     # integer division to compute the integral value 
r=n-d*i     # remainder of the integer division 
precision=6    # precision 
f=r*pow(10,precision)//d # keep the 6 most significant digits 
result=(i%400)+(f/pow(10,precision)) 

sonuç 6 haneli 271,048181 olduğunu. Bir egzersiz olarak, bunu daha az zanaat içinde gerçekleştiren bir işlevin yazılmasına izin veriyorum.

+0

kullanarak yapıyorum Bu çok yardımcı olur !! Teşekkür ederim!!! :) Bunu deneyecek. – Amy

+0

Christophe, "271.04" değerinin geri dönüş değeri ne kadar doğru olduğunu düşündüğünüzü söyleyebilir misiniz? Çok hassas olur mu? – Amy

+0

[Hata yayılma kuralları] 'na göre (http://www.fas.harvard.edu/~scphys/nsta/error_propagation.pdf) +/- 0.4243, tam değeri 270.62 ve 271.48 olmalıdır. – Christophe