其實在這一章裏面大部分的題作的都是很順暢的,直到遇到了最後一個題——也就是這個解一元二次方程組的題。這個題打眼一看其實挺簡單的,只是要考慮三種狀況——∆<0,∆>0,∆=0;但是實際操做時發現遠不止這麼簡單。這個題一開始我提交了一次有檢查了一遍,結果把錯誤改好後發現老是有一個檢查點錯誤。從網上搜索後才發現,c++有一個精度問題——當讀取的數字超出設定精度時,會讀取爲-0.這就要求咱們在程序中要考慮超出設定精度的狀況。c++
判斷精度時,由於∆有正有負,因此要用到絕對值。咱們日常用的絕對值都是abs(),而由於這裏是小數,因此要用到小數的取絕對值函數——fabs()。函數
經過完成這個題,我真是學到了很多我之前沒想過的知識。spa
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 }