c语言改错题 有关求一元二次方程ax2+bx+c=0的两个实根
麻烦帮忙看看下面三个程序的区别~~谢谢啦下列是用于求一元二次方程ax2+bx+c=0的两个实根的三个c程序,分别采用不同的方法或使用不同的精度。其中a=1.0,b=-(1...
麻烦帮忙看看下面三个程序的区别~~谢谢啦
下列是用于求一元二次方程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);
} 展开
下列是用于求一元二次方程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);
} 展开
2个回答
展开全部
(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的情况.
#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的情况.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询