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.
Hangi programlama dilini kullanırsınız? –
sadece VB ve Python – Amy