具有简单运算符的 N 次根
Nth root with simple operators
我正在尝试创建一个函数来查找数字的 n 次方根,而无需使用 Math 等库。我只能使用 +-*/ 运算符。
到目前为止,我一直在尝试重新创建 Math.Pow(double num, double root)
函数,但没有成功,因为我无法想出需要两个双打的解决方案。
我试过使用这个:
double pow(double a, int n) {
double result = 1;
for(int i = 0; i < n; i++) {
result *= a
}
return result;
但这对我来说真的不起作用,因为它需要一个 int 作为根而不是 double。
我需要 Math.Pow(double a, double b)
的源代码或重制版
让我们改编 Rosetta 代码 (https://rosettacode.org/wiki/Nth_root) 中的代码:
private static double DPow(double a, int n)
{
var result = 1.0;
for (; n > 0; n--) result *= a;
return result;
}
private static double DAbs(double a)
{
return (a > 0.0) ? a : -a;
}
public static double NthRoot(double a, int n, double p)
{
var _n = (double)n;
var x0 = a;
var x1 = a / _n;
while (DAbs(x0 - x1) > p)
{
x1 = x0;
x0 = (1.0 / _n) * (((_n - 1.0) * x1) + (a / DPow(x1, _n - 1.0)));
}
return x0;
}
public static double NthRoot(double a, int n)
{
return NthRoot(a, n, .0001);
}
我们实现了一个简单的 pow 函数和一个非常简单的 abs 函数,并使用两者来实现 Rosetta Code 站点给出的算法。希望这能满足您的要求!
我正在尝试创建一个函数来查找数字的 n 次方根,而无需使用 Math 等库。我只能使用 +-*/ 运算符。
到目前为止,我一直在尝试重新创建 Math.Pow(double num, double root)
函数,但没有成功,因为我无法想出需要两个双打的解决方案。
我试过使用这个:
double pow(double a, int n) {
double result = 1;
for(int i = 0; i < n; i++) {
result *= a
}
return result;
但这对我来说真的不起作用,因为它需要一个 int 作为根而不是 double。
我需要 Math.Pow(double a, double b)
让我们改编 Rosetta 代码 (https://rosettacode.org/wiki/Nth_root) 中的代码:
private static double DPow(double a, int n)
{
var result = 1.0;
for (; n > 0; n--) result *= a;
return result;
}
private static double DAbs(double a)
{
return (a > 0.0) ? a : -a;
}
public static double NthRoot(double a, int n, double p)
{
var _n = (double)n;
var x0 = a;
var x1 = a / _n;
while (DAbs(x0 - x1) > p)
{
x1 = x0;
x0 = (1.0 / _n) * (((_n - 1.0) * x1) + (a / DPow(x1, _n - 1.0)));
}
return x0;
}
public static double NthRoot(double a, int n)
{
return NthRoot(a, n, .0001);
}
我们实现了一个简单的 pow 函数和一个非常简单的 abs 函数,并使用两者来实现 Rosetta Code 站点给出的算法。希望这能满足您的要求!