c语言改错题 有关求一元二次方程ax2+bx+c=0的两个实根

麻烦帮忙看看下面三个程序的区别~~谢谢啦

下列是用于求一元二次方程ax2+bx+c=0的两个实根的三个c程序,分别采用不同的方法或使用不同的精度。其中a=1.0,b=-(1012+1),c=1012。
分别输入并运行这三个程序,并检验结构是否正确,分析原因。
(1)利用求根公式
程序如下:
#include <math.h>
#include <stdio.h>
void main( )
{float a,b,c,p,d,x1,x2;
a=1.0;
b=-(1.0e+12+1.0);
c=1.0e+12;
p=sqrt(b*b-4.0*a*c);
d=2.0*a;
x1=(-b+p)/d;
x2=(-b-p)/d;
printf(“x1=%e\nx2=%e\n”,x1,x2);
}

(2)利用求根公式计算一个实根,然后根据韦达定理计算另一个实根
程序如下:
#include <math.h>
#include <stdio.h>
void main( )
{float a,b,c,p,d,x1,x2;
a=1.0;
b=-(1.0e+12+1.0);
c=1.0e+12;
p=sqrt(b*b-4.0*a*c);
d=fabs(b)/b;
x1=(-b-d*p)/(2.0*a);
x2=c/(a*x1);
printf(“x1=%e\nx2=%e\n”,x1,x2);
}
(3)与(1)一样,利用求根公式,但程序中的变量均使用双精度类型。
#include <math.h>
#include <stdio.h>
void main( )
{double a,b,c,p,d,x1,x2;
a=1.0;b=-(1.0e+12+1.0);c=1.0e+12;
p=sqrt(b*b-4.0*a*c);
d=2.0*a;
x1=(-b+p)/d;
x2=(-b-p)/d;
printf(“x1=%e\nx2=%e\n”,x1,x2);
}

(1)的方法是错的,因为float精度有限,最多只能保存7位有效数字,所以b的值在计算机中保存的实际上是-1.0e+12,那个额外的1是没法保存下来的,不信的话,你可以用下面的代码测试下.
#include <math.h>
#include <stdio.h>
void main( )
{float a,b;
a=1.0e+12+1.0;
b=1.0e+12;
printf("%e\n",a-b);
}

同理,求出的p值理论上应该是sqrt((1e12-4)*1e12),但因为4与1e12相比实在太小,在float的精度下是没法记录的,所以计算机中保存的p值和-b的值是一样的,都是-1e12,所以-b-p只能得到0.求出的x2是0,而正解应该是1.

(3)用了double,精度足够大,可以保存15-16位有效数字,因此b,p的值都是相对精确的,求出的解是正确的.

(2)用了个小技巧,确保了不做-b和p值的减法,而只做加法,这样不会因为float精度不够导致两个理论上有较小差距的数,相减时产生差为0的情况.
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-29
b=-(1012+1)表示为指数是b=-(1e3+13) c=1012表示为指数是c=1e3+12
(注:指数形式表示方式:字母e或E之前必须有数字,且e后面的指数必须为整数,如5689.65按指数输出是5.68965e++3)
你的指数都表示错误,下面的就别提了,还要,你写的代码太局限性,a,b,c应该由需要输入,不要固定他们的值

c语言改错题 有关求一元二次方程ax2+bx+c=0的两个实根
(1)的方法是错的,因为float精度有限,最多只能保存7位有效数字,所以b的值在计算机中保存的实际上是-1.0e+12,那个额外的1是没法保存下来的,不信的话,你可以用下面的代码测试下.include <math.h> include <stdio.h> void main( ){float a,b;a=1.0e+12+1.0;b=1.0e+12;printf("%e\\n...

用c语言怎么求方程ax2+ bx+ c=0的根?
1、一元二次方程ax^2+bx+c=0的根的求解涉及到数学的二次方程解公式。当我们谈论一元二次方程的根时,我们实际上是在谈论这个方程的解,也就是能够使得方程成立的未知数的值。在C语言中,我们可以使用数学库来帮助我们进行计算。2、首先,我们需要明白一元二次方程的解的公式。这个公式是:x=(-...

C语言编程,求一元二次方程 ax2+bx+c=0 的解,谢谢
include<iostream> include<cmath> using namespace std;int main(){ for (int i=0;i<2;i++){ double a,b,c,delta,p,q;cin>>a>>b>>c;delta=b*b-4*a*c;p=-b\/(2*a);q=sqrt(fabs(delta))\/(2*a);if (delta>=0)cout<<p+q<<endl<<p-q<<endl;else { cout<<p<<"+...

...根ax²+bx+c+0的根。分别考虑有两个不等的实根,有两个相等的实根...
printf("方程的根:\\n");if(a==0){ printf("这不是一个一元二次方程。\\n");return;} else d=b*b-4*a*c;if(fabs(d)<=1e-6)\/ fabs是求实数绝对值的函数,由于d是一个实数,计算机在计算和存储时可能存在误差,所以当d是一个很小的数时,就认为他是0 *\/ printf("方程有两个...

C语言编写一个程序求解一元二次方程ax2+bx+c=0的根。要求系数a,b,c从...
main(){ float a, b, c, jud; printf ("输入二次方程的三个系数(第一个不能为0):"); scanf ("%f %f %f", &a, &b, &c); jud = b * b - 4 * a * c; \/\/根的判别式 if (jud > 0) { printf ("该方程有两个不相等的实根:\\n"); printf ("...

计算一元二次方程的根c语言
计基芦算一元二次方程的根的方法如下:一、需要将一元二次方程的一般形式ax^2+bx+c=0(a≠0)进行转化,得到x^2+b\/a*x+c\/a=0。通过求解该二次方程,可以得到两个解,即x1和x2。二、具体计算过程如下:将方程的一般形式转化为标准形式:x^2+b\/a*x+c\/a=0;计算判别式Δ=b^2-4ac...

C语言题 求方程ax^2+bx+c=0的根。分别考虑:有两个不等的实根;有两个...
x2 = (-b-deta)\/(2*a);} printf("x1=%.2f, x2 = %.2f\\n", x1, x2);\/\/输出两个根 } printf("===\\n");} return 1;} 输出:Please enter a, b and c:1 -7 12 a=1.00, b=-7.00, c=12.00 x1=4.00, x2 = 3.00 === Please enter a, b and c:2 -6 ...

c语言求一元二次方程ax²+bx+c=0的实根解(设a≠0)
include <stdio.h>#include <math.h>int main(){ double a,b,c; double p; scanf("%lf%lf%lf",&a,&b,&c); p=b*b-4*a*c; if(p<0) printf("无实根\\n"); else { p=sqrt(p)\/2\/a; printf("x1=%lf x2=%lf\\n", -b\/2\/a+p, -b\/2\/a-...

求一元二次方程ax2+bx+c=0的根+abc键盘输入,b2-4acc语言
以下是一个示例的 C 代码,用于计算一元二次方程 ax^2 + bx + c = 0 的根,并根据 b^2 - 4ac 的值来判断根的类型:include <stdio.h>#include <math.h>int main() {float a, b, c;float discriminant, root1, root2;printf("请输入一元二次方程的系数:\\n");printf("a = ")...

C语言编程:求1元2次方程的根
include "math.h"void main(){ printf("求方程ax^2+bx+c=0的根:\\n");L:printf("请分别输入a,b,c的值。\\n");double a,b,c,x1,x2,x,y;char z;printf("输入a,b,c=");scanf("a=%lf,b=%lf,c=%lf\\n,&a,&b,&c");printf("你所输入的方程为%lfx^2+%lfx+%lf=0...

相似回答