牛顿迭代法 是切线法,只有当 迭代区间 各点 存在 一阶导数,且 一阶导数 不为 0 时 才能 收敛,得到 解。
并非所有 函数 都能 用 牛顿迭代法。
你的程序,可以检查 f1, 若 f1 接近 0 时 就会发生溢出。 你可尝试改变迭代初值x, 让迭代过程避开 一阶导数 为 0 的点。
用^表示幂,当b^2-4ac≥0时的根为.x=(-b±√(b^2-4ac))/(2a)称为一元二次方程的求根公式当b^2-4ac>0时,有两个不同的根当b^2-4ac=0时,有两个相同的根当b^2-4ac<0时,没有实数根Private Sub Command1_Click()
Dim a, b, c
a = CDbl(InputBox("输入a值:"))
b = CDbl(InputBox("输入b值:"))
c = CDbl(InputBox("输入c值:"))
If b ^ 2 - 4 a c < 0 Then
Print "没有实根"
Else
Print "X1=" & (-b + Sqr(b ^ 2 - 4 a c)) / (2 a)
Print "X2=" & (-b - Sqr(b ^ 2 - 4 a c)) / (2 a)
End IfEnd Sub
早说嘛,还以为你不懂pow!
pow()的原理的源代码:
double my_pow(double x, double y)
{
register double ret, value;
double r = 10;
long p = (long) y;
if (x == 00 && y > 00)
return 00;
if (y == (double) p)
{
if (p == 0)
return 10;
if (p < 0)
{
p = -p;
x = 10 / x;
}
while (1)
{
if (p & 1)
r = x;
p >>= 1;
if (p == 0)
return r;
x = x;
}
}
__asm__(
"fmul %%st(1);"
"fst %%st(1);"
"frndint;\n\t"
"fxch;\n\t"
"fsub %%st(1);\n\t"
"f2xm1;\n\t"
: "=t" (ret), "=u" (value)
: "0" (log2 (x)), "1" (y)
);
ret += 10;
__asm__(
"fscale"
: "=t" (ret)
: "0" (ret), "u" (value)
);
return ret;
}
//这是一个求x的y次幂的函数,因为要求是浮点数类型的,所以代码复杂了许多。
//如果仅仅是求整数的x的y次幂,那么就简单了许多。
int main()
{
printf("%f\n",my_pow(00,00));
printf("%f\n",my_pow(10240,00));
printf("%f\n",my_pow(20,100));
printf("%f\n",pow(25,126));
printf("%f\n",my_pow(25,126));
system("pause");
return 0;
}
sqrt()原理的源代码:
本程序在Dev C++ 4992 下编译通过
double my_sqrt(double x)
{
register double ret;
__asm__(
"fsqrt"
: "=t" (ret)
: "0" (x)
);
return ret;
}//计算x的平方根。
int main()
{
double a = 4;
printf("sqrt(%f) = %f\n",a,my_sqrt(a));
a = 81;
printf("sqrt(%f) = %f\n",a,my_sqrt(a));
a = 12345678;
printf("sqrt(%f) = %f\n",a,my_sqrt(a));
system("pause");
return 0;
}
让输入 abc 三个常数
然后用if 判断B^2-4ac
>0 x1=(-b+B^2-4ac)/4ac x2=(-b-B^2-4ac)/4ac
=0 x1=x2=(-b+B^2-4ac)/4ac
<0 提示 无实根
以上就是关于编了一个牛顿迭代法求根的c程序,不知道为啥输出老是-1.#ind00全部的内容,包括:编了一个牛顿迭代法求根的c程序,不知道为啥输出老是-1.#ind00、用vb编写一个程序求一元二次方程ax2+bc+c=0的根、math.h 中求根n是怎么求的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)