C#isPowerOf函数

Nov*_*vak 7 c# math exponentiation

我有下一个功能:

static bool isPowerOf(int num, int power)
{
        double b = 1.0 / power;
        double a = Math.Pow(num, b);
        Console.WriteLine(a);
        return a == (int)a;
}
Run Code Online (Sandbox Code Playgroud)

我插入了打印功能进行分析.

如果我调用该函数:

isPowerOf(25, 2)
Run Code Online (Sandbox Code Playgroud)

5^2等于25后返回true.但是,如果我调用16807,那就是7^5下一个方法:

isPowerOf(16807, 5)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它打印'7'但a == (int)a返回false.

你能帮我吗?谢谢!

Dan*_*ani 6

尝试使用小epsilon进行舍入错误:

return Math.Abs(a - (int)a) < 0.0001;
Run Code Online (Sandbox Code Playgroud)

正如Harold建议的那样,如果a碰巧略小于整数值,最好是舍入,如3.99999:

return Math.Abs(a - Math.Round(a)) < 0.0001;
Run Code Online (Sandbox Code Playgroud)


har*_*old 5

已经提出了解决该问题的比较,但实际上问题在于浮点数根本不应该涉及.您想要一个涉及整数的问题的精确答案,而不是对本质上不准确的测量所做的计算的近似.

那怎么办呢?

首先想到的是作弊:

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
Run Code Online (Sandbox Code Playgroud)

只要guess不到1次就可以工作.但是我无法保证它总能为您的输入工作,因为并不总能满足这一条件.

因此,这里的,想到接下来的事情:为二进制搜索(如果您搜索的上界第一个变体)baseexponentiateBySquaring(base, power)为其结果最接近num.当且仅当最接近的答案等于num(并且它们都是整数,所以这个比较是干净的),那么num是一个power权力.除非存在溢出(不应存在),否则应始终有效.