איך עושים שורש ב c?

gmorphus

New member
sqrt?

אבל אני מניח שאתה צריך לכלול את math.h ואת זה אתה עושה על ידי הוספת השורה
#include <math.h>​
איפה שאתה רוצה להשתמש בפקודה (sqrt(n.
 

danshk

New member
זה לא פועל

#include <stdio.h> #include <math.h> void main() { float a,b,c,f,m; printf("please enter a:\n"); scanf("%f", &a); printf("please enter b:\n"); scanf("%f", &b); printf("please enter c:\n"); scanf("%f", &c); m=sprt(b*b-4*a*c); printf("the first x (x1) is: %f/n",(-b*b+m)/(2*a)); printf("the second x (x2) is: %f/n",(-b*b-m)/(2*a)); printf("press any key..."); scanf("%d", &f); }​
זה עושה לי בעיות עם הsprt
 

danshk

New member
תקשיבו התוכנה הייתה אמורה להיות

כלי למציאת שורשים על פי נוסחאת השורשים-
b^2+-sqrt(b^2-4ac) ----------------- 2a​
אבל התוצאות לא נכונות בכלל לדוגמה אם אני מזין a=1 b=5 c=6 התוצאה שיוצאת שם בכלל לא קשורה ובמספרים מורכבים יותר אין תוצאה בכלל. הקוד הוא
#include <stdio.h> #include <math.h> void main() { float a,b,c,f,m; printf("please enter a:\n"); scanf("%f", &a); printf("please enter b:\n"); scanf("%f", &b); printf("please enter c:\n"); scanf("%f", &c); printf("the first x (x1) is: %f\n",(-b*b+sqrt(b*b-4*a*c))/(2*a)); printf("the second x (x2) is: %f\n",(-b*b-sqrt(b*b-4*a*c))/(2*a)); printf("press any key..."); scanf("%d", &f); }​
תודה רבה למגיבים
 

danshk

New member
אופס איזו טעות זה בכלל b- ולא b^2-

טוב תראו בחופש שוכחים
 
כמה דברים:../images/Emo26.gif

1) נכון - זה b- 2) רק כדאי להכניס אותו ואת השורש לתוך סוגרים (אחרת החילוק יעשה לפני החיסור/חיבור) 3) ולא כדאי לבדוק את הדלתה? (את הארגומנט שאתה שולח ל-sqrt?) אם הוא שלילי תקבל שגיאה... כדאי במקרה כזה, במקום שהתוכנית תעוף - לתת הודעה שאין שורשים למשוואה... ואם הוא 0 כדאי לתת הודעה על שורש יחיד... 4) בנוסף, כדאי גם לטפל במקרה ש-a שווה לאפס.... אצלך התוכנה תעוף - במציאות זו אופציה סבירה... (ואז תקבל משוואה ממעלה ראשונה...)
 

danshk

New member
תודה על העצות

תודה על העצות תוך כדי ההתקדמות שלי בשפה אני אפתח את התוכנה.
 

danshk

New member
שדרגתי את התוכנה

(אני מקווה רק שאין לי טעויות איות ודקדוק). התייחסתי למקרים שבהם הדיסקרימיננטה שווה ל0 או קטנה מ0. וכמוכן התייחסתי למקרה שa=0 מכיוון שהמטרה של נוסחאת השורשים היא למצוא את נקודות ה0 של הפונקציה אם הן קיימות אז החלטתי פשוט להגיד מה תהיה הנקודת 0 (לפי המשוואה למציאת נקודת 0 בפונקציה לינארית). תודה לכל המגיבים (ואם יש למישהו עוד הצעות לשיפור אז אני אשמח לשמוע) הקוד מקור זה
#include <stdio.h> #include <math.h> void main() { double a,b,c,f,m; printf("Welcome To The Square Root Program\n"); printf("This program designed to calculate the square root of the square equation\n"); printf("ax^2+bx+c\n"); printf("Please enter the parameter a:\n"); scanf("%lf", &a); printf("Please enter parameter b:\n"); scanf("%lf", &b); printf("Please enter parameter c:\n"); scanf("%lf", &c); if (a==0) { printf("the root for this equation is x=%lf", -c/b); } else { if (b*b-4*a*c<0) { printf("There aren't square roots for the above parameters.\n"); printf("Press any key..."); scanf("%lf", &f); } if ((b*b-4*a*c)==0) { printf("There is only one square root for the above parameters."); printf("x=%lf \n",(-b+sqrt(b*b-4*a*c))/(2*a)); } else { printf("The first x (x1) is: %lf\n",(-b+sqrt(b*b-4*a*c))/(2*a)); printf("The second x (x2) is: %lf\n",(-b-sqrt(b*b-4*a*c))/(2*a)); } getchar(); getchar(); } getchar(); getchar(); }​
 
ועכשיו...../images/Emo13.gif../images/Emo26.gif

תנסה לחשוב מה קורה אם בנוסף ל-a גם b=0...
רמז: תחשוב מה זה אומר במקרה ש c=0 ומה זה אומר במקרה ש-c שונה מאפס... מסובכת כל המתמטיקה הזו, הא?...
 

alexrait1

New member
אתה יכול לממש בעצמך

שורש. זה לא באמת בעיה, פשוט נעשה קירוב על ידי ניוטון רפסון. x(n+1)=x(n)-1/2*(x(n)-c/x(n)) ddd כאשר אנחנו רוצים לחשב את הערך c פשוט לוקחים את x באיטרציה הראשונה כc/2 למשל, ואז מריצים בערך 5-6 איטרציות שזה נותן דיוק עצום. לולאה קטנה ולא צריך שום sqrt, מה גם שזה יכול להיות הרבה יותר יעיל אם אתה משתמש בזה הרבה ולא צריך דיוק של 16 ספרות אחרי הנקודה אלא רק 5 נניח.
 

alexrait1

New member
תיקון קטן

אנחנו מנסים בנוסחה שהבאתי לחשב את שורש הערך C
 
יש לך טעות יותר מהותית...../images/Emo4.gif../images/Emo26.gif

מעבר לטעויות טכניות, יש לך 2 טעויות מהותיות: 1) כשעונים לשאלה, צריך להתחשב ברמה שלה וברמה של השואל... כשנער בן 15 שואל איך עושים שורש ב-C, ובהמשך גם עונה לי שהוא עדיין לא יכול ליישם את ההצעה שלי (כנראה כי הם עוד לא למדו if...) - אז לא נראה שתשובה עם חישוב איטרטיבי בעזרת נוסחת ניוטון-רפסון תועיל לו במשהו...
2) חוקי המספרים הקטנים במדעי המחשב:
0 > 1 כלומר, אם אפשר להסתדר בלי לכתוב קטע קוד - אז אין שום סיבה לכתוב אותו (כתיבת קוד מיותר רק יזיק - יגדיל את הסיכוי לבאגים ויקשה על תחזוקת הקוד)
1 > 2 כלומר, אם יש לך 2 קטעי קוד זהים - כנראה שהם צריכים להופיע רק פעם אחת... (=להמנע משכפול קוד ומ"המצאת הגלגל" + reuse של קוד הוא לא רק משיקולי נוחיות, אלא הוא יוצר קוד אמין יותר, תחזוקתי יותר ויציב יותר) בקיצור, בתוכנית כמו שהנער הציג כאן, החסכון של של כמה מילי-שניות בחישוב השורש היא זניחה. הסיבוך המיותר שאנחנו מכניסים לקוד עם ניוטון-רפסון הוא ללא הצדקה. (אבל לא נורא - אולי מישהו בכל זאת למד מההודעה שלך איך מממשים חישוב שורש...
)
 

alexrait1

New member
זה נכון באופן כללי

אבל לא נכון כאשר באים לעשות אופטימיזציות לקוד.
 

DadleFish

New member
קדימה,

אתה מוזמן לבדוק את ההבדל בין sqrt לבין ניוטון רפסון בדיוק סביר. אתה עשוי להיות מופתע.
 
למעלה