בעייה

אוריקס

New member
בעייה

יש לי תוכנית פשוטה בפסקל שפותרת משוואה ריבועית. הבעייה היא שהשורשים לא מוצגים טוב, אבל אם אני מעגל אותם והופך אותם ל INTEGER, הם מוצגים מצויין (במידה והם עגולים). למשל, תכניסו A=3, B=37, C=1786 ותראו שX1 אמור להיות 19 אך מוצג כ 1.9. אם אני מעגל את המשתנה והופך אותו ל INTEGER אז זה באמת 19. הבעייה היא שאני לא יכול להפוך תמיד כי לפעמים יש שורשים שהם שברים, ואני חייב להשאר עם REAL. מה לעשות
(הקוד כאן והתכנית עצמה בקובץ, תהפכו בבקשה ל EXE)
Program ribooit; uses crt; var a,b,c,xone,xtwo:real; ex:boolean; exx:char; Begin While (ex=false) do begin clrscr; Write('Input a,b,c: '); ReadLn(a,b,c); xone:=((-b)+Sqrt(sqr(b)-(4*a*c))) / (2*a); xtwo:=((-b)-Sqrt(sqr(b)-(4*a*c))) / (2*a); If xone = xtwo then WriteLn('X1: ',xone) else begin WriteLn('X1: ',xone); WriteLn('X2: ',xtwo); end; WriteLn; Write('More? (y/n)'); ReadLn(exx); If exx='n' then ex:=true; end; End.​
 

yuval k

New member
הוא לא מוצג כ-1.9...

הבעייה שלך: דיוק יתר. אין float או משהו כזה, משהו פחות מדוייק מ-real? זה יעזור לך
 

אוריקס

New member
אני לא מכיר FLOAT

אבל מה זאת אומרת דיוק יתר, 1.9000000000 זה לא 19.0000000000...
 

yuval k

New member
למשל...

עבור a=1, b=2, c=1 אתה מקבל
-1.0000000000E+00​
עבור a=3, b=37, c=-1786 -
X1: 1.9000000000E+01 X2: -3.1333333333E+01​
לא 1.9. אתה רואה שיש לך +01, אם אני לא טועה (לא מכיר את זה ממש) - זה אומר שאתה צריך להסיט את האפס ימינה במקום אחד. אני כן חושב שאפשר להימנע מהצורה הזו של דיוק. לא מכיר פסקל כ"כ טוב (פעם עבדתי איתה קצת
).
 

gilad g

New member
תדפיס את זה ככה:

WriteLn('X1: ',xone:0:0); WriteLn('X2: ',xtwo:0:0);​
|אייקון של גלעד שהיה צריך לסבול את פסקל במשך שלוש שנים|
 

gilad g

New member
בעצם

WriteLn('X1: ',xone:0:3); WriteLn('X2: ',xtwo:0:3);​
זה ייתן דיוק של שלוש ספרות אחרי הנקודה.
 

gilad g

New member
אוריקס ----

לא בדקת מה קורה אם הדיסקרימיננטה שלילית.
 

אוריקס

New member
תתעקשו, תתעקשו

Program ribooit; Uses crt; Var a,b,c,xone,xtwo:real; ex:boolean; exx:char; Begin While (ex=false) Do Begin Clrscr; Write('Input a,b,c: '); ReadLn(a,b,c); If (sqr(b)-(4*a*c))=0 Then Begin xone:=((-b)+Sqrt(sqr(b)-(4*a*c))) / (2*a); WriteLn('One Root Only: ',xone:0:9); End Else If (sqr(b)-4*a*c) < 0 Then WriteLn('No Roots') Else Begin xone:=((-b)+Sqrt(sqr(b)-(4*a*c))) / (2*a); xtwo:=((-b)-Sqrt(sqr(b)-(4*a*c))) / (2*a); WriteLn('X1: ',xone:0:9); WriteLn('X2: ',xtwo:0:9); End; WriteLn; Write('More? (y/n)'); ReadLn(exx); If exx='n' Then ex:=true; End; End.​
כל הזכויות שמורות...
 
למעלה