一本通题库 1058:求一元二次方程
其实在这一章里面大部分的题做的都是很顺畅的,直到遇到了最后一个题——也就是这个解一元二次方程组的题。这个题打眼一看其实挺简单的,只是要考虑三种情况——∆<0,∆>0,∆=0;可是实际操作时发现远不止这么简单。这个题一开始我提交了一次有检查了一遍,结果把错误改好后发现总是有一个检查点错误。从网上搜索后才发现,c++有一个精度问题——当读取的数字超出设定精度时,会读取为-0.这就要求我们在程序中要考虑超出设定精度的情况。
判断精度时,因为∆有正有负,所以要用到绝对值。我们平常用的绝对值都是abs(),而因为这里是小数,所以要用到小数的取绝对值函数——fabs()。
通过完成这个题,我真是学到了不少我以前没想过的知识。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define xiao 0.000000000001//设定delta的精度,可根据需要更改 4 #define xi 0.000001 //设定x的精度(因为delta要开方,精度会减小,所以x的精度判断也要减小。)
5 int main()
6 {
7 double a,b,c,x[2],dt; 8 cin>>a>>b>>c; 9 dt=b*b-4*a*c; 10 if(dt<0&&fabs(dt)>xiao)//判断delta是否小于零
11 { 12 cout<<"No answer!"; 13 return 12; 14 } 15 else if(fabs(dt)<xiao)//如果delta小于设定精度,此时delta约等于零,当做delta等于零。 16 { 17 x[0]=(-b)/2/a; 18 if(fabs(x[0])>xi) 19 { 20 printf("x1=x2=%.5lf",x[0]); 21 } 22 else 23 { 24 printf("x1=x2=%.5lf",0);//如果x超出设定精度,此时x约等于零,当做x等于零。 25 } 26 } 27 if(dt>xiao) 28 { 29 x[0]=(-b+sqrt(dt))/2/a; 30 if(fabs(x[0])<xi) 31 { 32 x[0]=fabs(x[0]);//如果x超出设定精度,此时x会被视为-0,要加绝对值 33 } 34 x[1]=(-b-sqrt(dt))/2/a; 35 if(fabs(x[1])<xi) 36 { 37 x[1]=fabs(x[1]);//同上 38 } 39 sort(x,x+2); 40 printf("x1=%.5lf;x2=%.5lf",x[0],x[1]); 41 } 42 return 0; 43 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· 在外漂泊的这几年总结和感悟,展望未来
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?