C语言用循环替代pow函数计算n次方根结果异常问题求助
问题原因分析
degree变量没有在每次迭代时重置
你当前的degree仅在定义时初始化为1,每次进入迭代循环计算xs的n-1次方时,没有重置为初始值1,会沿用上次循环计算的结果继续累乘,导致degree的数值完全错误,最终计算的xn偏离正确值。- 迭代判断前
xs未初始化
你在进入while(fabs(xn-xs)>EPS)判断时,xs还没有被赋值,是不确定的随机值,会导致循环的终止条件判断完全异常,甚至可能出现死循环或者提前退出的问题。 - 循环边界对非整数n不兼容
你输入的n是double类型,如果n不是正整数,for循环的i<=(n-1)判断逻辑会出错,如果你仅需要计算整数次方根,可以把n的类型改为int避免歧义,如果需要支持非整数n,需要额外实现浮点幂的计算逻辑。
修复后的代码示例
#include <stdio.h> #include <stdlib.h> #include <math.h> #define EPS 1e-5 int main() { // 把n改为int类型适配循环逻辑 int n; double xs,xn,x,degree; printf("Enter n>0:"); scanf("%d",&n); while(n<1) { printf("Enter n>0:"); scanf("%d",&n); } printf("Enter x:"); scanf("%lf",&x); xn=(x+1)/n; // 提前给xs赋值避免第一次判断使用野值 xs = xn + 2 * EPS; while(fabs(xn-xs)>EPS) { xs=xn; // 每次计算幂之前重置degree为1 degree = 1; for(int i=1;i<=(n-1);i++) { degree=degree*xs; } xn=(1.0/n)*((n-1)*xs+(x/degree)); } printf("%lf",xn); return 0; }
内容的提问来源于stack exchange,提问作者PC Safe
相关产品推荐
相关产品推荐

