C 为什么我在自己的第n根代码中得到这个结果?

C 为什么我在自己的第n根代码中得到这个结果?,c,function,pow,C,Function,Pow,我试着用我自己的代码来计算一个数字的n次方。它适用于109量级的数字,但对于更大的数字,它会给我带来奇怪的东西 double nroot(double a, double b) { int j; double i, wtemp, w, xf, x, bgint, lsint, eps = 0.000000001, delta; if (b == 0) return 0; if (a == 1) return b; whil

我试着用我自己的代码来计算一个数字的n次方。它适用于109量级的数字,但对于更大的数字,它会给我带来奇怪的东西

double nroot(double a, double b) {
    int j;
    double i, wtemp, w, xf, x, bgint, lsint, eps = 0.000000001, delta;

    if (b == 0)
        return 0;
    if (a == 1)
        return b;
    while (xf < (int)b) {
        i++;
        xf = power(i, a);
    }
    if (xf == b)
        return i;
    if (xf == b && a < 0)
        return 1 / i;   
    else {
        bgint = i;
        lsint = i - 1;      
        for (j = 0; j < 1000000; j++) { 
            x = ((b - power(lsint, ABS(a))) / (xf - power(lsint, ABS(a)))) * (bgint - lsint);   
            w = lsint + x;
            delta = w - wtemp;
            if (ABS(delta) < eps) {
                return w;
            } else {    
                lsint += x;
                wtemp = w;              
            }
        }
        if (a > 0)
            return w;
        else
            return 1 / w;
    }
}
事情是这样的:如果一个do
nroot(21000000)/*10.000.000.000*/
我得到
-1.000002

我不明白这个结果从何而来,因为如果我做
nroot(21000000)/*1.000.000.000*/
我会得到
31622.776599
,这是正确的结果


任何审查将不胜感激

您的
电源
功能似乎正常

您的问题来自以下方面:

while(xf<(int)b)

您的
电源
功能似乎正常

您的问题来自以下方面:

while(xf<(int)b)

您的代码具有未定义的行为,因为
xf
中未初始化,而(xf<(int)b){

在某些情况下,它只是偶然起作用……此外,将
b
转换为
(int)如果
b
大于
INT\u MAX
,在32位系统上约为20亿,则
是不必要的,并且会产生反作用。请注意,
i
也未初始化。在该循环之前,您可能应该将
i
xf
都设置为
1

i = xf = 1;    
while (xf < b) {
    i++;
    xf = power(i, a);
}
i=xf=1;
while(xf
您的代码具有未定义的行为,因为
xf
中未初始化,而(xf<(int)b){

在某些情况下,它只是偶然起作用……此外,将
b
转换为
(int)如果
b
大于
INT\u MAX
,在32位系统上约为20亿,则
是不必要的,并且会产生反作用。请注意,
i
也未初始化。在该循环之前,您可能应该将
i
xf
都设置为
1

i = xf = 1;    
while (xf < b) {
    i++;
    xf = power(i, a);
}
i=xf=1;
while(xf
你的第一项工作是看看使用标准的
pow
函数是否解决了这个问题。顺便说一句,(n)个根元素可以用Newton Raphson解决。你的算法看起来不稳定,对我来说可能有缺陷。如何定义
ABS()
?阅读您使用的每个函数的参数;对于您的下一个问题,请提供一些参数。如果您不打算支持分数根,则相应的参数应该是
int
s,而不是
double
s。@Bathsheba实际上我知道我的函数幂在很大的数下不起作用,但现在我想我知道为什么了。另外,我知道还有其他更好的方法,我只是用这种方法来证明效率。顺便说一句,问题出在
中。你的第一项工作是看看使用标准
pow
函数是否解决了这个问题。顺便说一下,(n)根问题可以用Newton Raphson来解决。你的算法看起来不稳定,在我看来可能有缺陷。如何定义
ABS()
?阅读您使用的每个函数的参数;对于您的下一个问题,请提供一些参数。如果您不打算支持分数根,则相应的参数应该是
int
s,而不是
double
s。@Bathsheba实际上我知道我的函数幂在很大的数下不起作用,但现在我想我知道为什么了。另外,我我知道还有其他方法可以更好地工作,我只是用这种方法来证明效率。顺便说一下,问题出在
中。是的,我认为这是问题所在,而且我的变量I和xf没有初始化。是的,我认为这是问题所在,而且我的变量I和xf没有初始化不敢相信我没有注意到,现在代码工作得足够好,谢谢!我不敢相信我没有注意到,现在代码工作得足够好,谢谢!