Karşılaştırmalar önerilmiştir güçler tamsayı yükselterek zaman Math.Pow
int
aralığında sayılar için kesin olacak, ama burada ne aslında problem kayan nokta her de dahil edilmemelidir olmasıdır. Tamsayılarla ilgili bir soruyu tam olarak yanıtlamak istiyorsunuz, doğal olarak yanlış ölçümler üzerinde yapılan hesaplamaların bir yaklaşımı değil.
Peki bu nasıl yapılabilir?
double guess = Math.Pow(num, 1.0/power);
return num == exponentiateBySquaring((int)guess, power) ||
num == exponentiateBySquaring((int)Math.Ceil(guess), power);
// do NOT replace exponentiateBySquaring with Math.Pow
Bu sürece guess
1 kapalı azdır şekilde çalışmaya devam eder:
akla gelen ilk şey bir hile olduğunu. Ancak, her zaman sizin girdileriniz için çalışacağını garanti edemem çünkü bu koşul her zaman karşılanmaz.
Yani burada akla gelen bir sonraki şey: exponentiateBySquaring(base, power)
yılında base
için ikili arama (önce üst sınırından arama varyant) olan sonuç num
en yakın olanı. En yakın yanıt num
'a eşitse ve (ve her ikisi de tamsayıysa, bu karşılaştırma temiz kalırsa) ve ardından num
bir power
-th gücüdür. Taşma olmadığı sürece (olmamalı), bu her zaman çalışmalıdır.
[Her Bilgisayar Bilimcinin Kayan Nokta Aritmetiği Hakkında Bilmeniz Gerekenler] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – AakashM
Herkes daha iyi önerecektir kayan nokta karşılaştırmaları, ancak IMO sorunun kökünü burada algoritmadır. – harold