計算一元二次方程的根

2021-10-04 03:07:47 字數 1437 閱讀 3381

#include

#include

#include

#define eps 1e-6

int main(int argc, const char * ar**) {

float a,b,c,disc,p,q;

printf("input the coefficients a,b,c\n");

scanf("%f,%f,%f",&a,&b,&c);

if(fabs(a)<=eps) //fabs()是乙個對浮點數求絕對值的函式, a=0時,輸出「不是一元二次方程 」

printf("it is nout a quadartic equation!\n");

exit(0);//終止程式執行,強制返回作業系統

disc=b*b-4*a*c; //計算判別式

p=-b/(2*a);

q=sqrt(fabs(disc))/(2*a);

if(fabs(disc)<=eps) //判斷判別式等於0時,輸出兩個相等的實根

printf("x1=x2=%.2f\n",p);

else

if(disc>eps)

printf("x1=%.2f,x2=%.2f\n",p+q,p-q);

else

printf("x1=%.2f+%.2fi,",p,q);

printf("x2=%.2f-%.2fi\n",p,q);

執行結果:

這裡在剛開始測試時,出現了乙個錯誤,如圖所示:

得不到正確的結果。

錯誤的原因時在輸入的時候忽略了c語言是從緩衝區讀取資料的,應該用空格依次去輸入資料,而錯誤的方法卻用了空格鍵,c語言讀取了空格,導致無法計算。

注意:(1)fabs()和abs()函式的區別,第一,abs()函式是對整數取絕對值,fabs()函式則對浮點數取絕對值。第二,標頭檔案不同,fabs()的標頭檔案是#include,而abs()的標頭檔案是#include 。

(2為什麼沒有直接和0比較呢?

答:由於實數在記憶體中是以浮點形式儲存的, 階碼所佔的位數決定實數的表數範圍,尾數所佔的尾數決定實數的精度,ascii c並沒有明確規定三種浮點型別的階碼和尾數所佔的位數,不同的c編譯器分配給階碼和尾數的尾數是不同的,無論怎樣,浮點數在記憶體中儲存時其尾數所佔的位數都是有限的,因此其能表示的實數的精度也是有限的,換句話說就是浮點數並非真正意義上的實數,只是在某種範圍內的近似,因此只能用近似的方法將實數和0進行比較。

if(disc==0)

這樣的比較是錯誤的,應判斷浮點數disc是否近似為0,即是否位於0附近乙個很小的區間裡[-eps,eps],

一元二次方程

作 者 a42 覃燕玲 完成日期 2014年 10 月 25 日 版 本 號 v1.0 問題描述 建立乙個程式解平方根 輸入描述 ax 2 bx x 0 a o 程式輸出 平方根 using system using system.collections.generic using system.l...

一元二次方程

一 知識要點 一元二次方程和一元一次方程都是整式方程,它是初中數學的乙個重點內容,也是今後學習數學的基 礎。一元二次方程的一般形式為 ax 2 2為次數,即x的平方 bx c 0,a 0 它是只含乙個未知數,並且未知數的最高次數是2 的整式方程。解一元二次方程的基本思想方法是通過 降次 將它化為兩個...

求一元二次方程的根

求一元二次方程的根 總時間限制 1000ms 記憶體限制 65536kb 描述 利用公式x1 b sqrt b b 4 a c 2 a x2 b sqrt b b 4 a c 2 a 求一元二次方程ax2 bx c 0的根,其中a不等於0。輸入 輸入一行,包含三個浮點數a,b,c 它們之間以乙個空格...