שפת C וטורי טיילור

neko

New member
שפת C וטורי טיילור

אני כותב תוכנית בC שמחשבת טור טיילר (של E^X), ומשום מה כבר באיבר השני של הטור אני מקבל 1.#QNAN0 ... מה זה, ומה עשיתי רע?
אה, וכתוב בשאלה שאני צריך להשתמש בINCREMENTAL COMPUTATION, מה רוצים ממני?
 

אלדד28

New member
זה אומר שיש לך באג

QNAN הוא Quiet NAN, כאשר NAN זה Not a number. הגעת לערך בלתי סביר. תעלה את התוכנית ונראה (מי מאיתנו שזוכר את הנוסחה של טורי טיילור).
 

neko

New member
התקדמנו:

נפתרה הבעיה של הQNAN (פשוט שכחנו לעשות RETURN RESULT בסוף הפונקציה
אז היא החזירה NAN...) עכשיו הפונקציה עובדת נפלא לכל הערכים, אבל יש לי בעיה בMAIN. זה הקוד:
double e, lambda=0, x=0; printf("Plase enter two real numbers: x lambda\n"); scanf("%f%f", &x, &lambda); printf("%f%f", x, lambda);​
משום מה X וLAMBDA נשארים 0 כל הזמן, ולא משנה מה הUSER מכניס בINPUT...
 

אלדד28

New member
אוריארד צודק ../images/Emo45.gif

אתה יכול להשתמש ב - lf, או להעביר float כמו שהצעתי.
 

neko

New member
../images/Emo45.gif רק למה לא מלמדים אותנו דברים

כאלה...
 

erezsh

New member
2 ניחושים:

א) אתה לא *באמת* אמור להשתמש ב-scanf ב) אם כבר כן, כדאי שתקרא ביסודיות את כל ה-reference הסטנדרטי, ואז לא תהיה בעיה.
 

neko

New member
לא הגיוני, כי לא הפנו אותנו למקום

בו יש רפרנסים (אנחנו מקמפלים על סרבר), ולא לימדו אותנו שום אמצעי קלט למעט SCANF...
 
זה לא בעייתי...../images/Emo26.gif

צריך רק להתאים את המחרוזת ב-scanf (וב-printf) ל-type... ב-scanf זה ככה: * f% - ל-float * lf% - ל-double * Lf% - ל-long double ... בכל מקרה - נראה לי שאת הרשימות המלאות יש ב-man ובכל ספר בסיסי של C... איפה אתה לומד?...
 

neko

New member
בבינתחומי בהרצליה, קורס בC

שנה שנייה. לא אמורים ללמד אותנו עקרונות תכנות (בשביל זה יש יותר מדי קורסים...), אלא בעיקר את השפה עצמה ואת ההבדלים מJAVA שהייתה השפה הראשונה שלנו.
 

eyalbd

New member
לגבי incremental

שים לב שהביטוי:
a0 + a1 * X + a2 * X ^ 2 + a3 * X ^ 3​
ניתן לכתיבה כך:
a0 + X * (a1 + X * (a2 + X * a3)))​
בגירסה השניה יש הרבה פחות פעולות כפל אם נחשיב את החזקות לכפל. לגבי הפונקציה (exp(x אנחנו מרויחים גם בנושא העצרת. אתה מוזמן לפתוח את הביטוי הבא:
1 + X * ( 1 + (X / 2) * (1 + (X / 3) * (1 + (X / 4) * (1 + (X / 5)))))​
נשאר רק להכניס את זה ללולאה.
 

neko

New member
המממ... לולאה שתחשב את זה

חייבת להתחיל מהסוף, או שפיספסתי משהו שוב? (כי אם כן, זה דורש התחכמות מה מבחינת הקוד...)
 

eyalbd

New member
כן, הלולאה מתחילה מהסוף

בנוסחה שנתתי לך הלולאה מתחילה מהסוף. אומנם הטור הוא אינסופי אבל אתה תצטרך מספר סופי של איברים כך שזה לא משנה. אל תפתח ציפיות לדיוק רב משום שיש תמיד שגיאות עיגול וקיטוע שמצטברות להן. עם 10 עד 15 איברים וחזקה נמוכה הדיוק מצויין.
 

neko

New member
לא, הבעיה היא שקביעת מס' האיברים

אמורה להעשות ע"י לולאה עד שהשינוי בכל איטרציה קטן מ-LAMBDA. אם מתחילים את הלולאה מהסוף, אני צריך איכשהו לקבוע מראש את מספר האיברים שיחוברו.
 

eyalbd

New member
אהה, אז תעשה incremental אחרת

מההתחלה לסוף. בכל לולאה צריך להוסיף ! x^n / n אבל לחשב זאת זה יהיה בזבוז לכן תכפיל את את האיבר ה n-1 ב- x/n כך:
sum = 1 divisor = 1 addition = 1 while (addtion > epsilon) addtion = addition * x / divisor sum = sum + addition divisor = divisor + 1​
 
למעלה