נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: עיגול מספרים ב-c

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
eyalmen
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 02 April 2011
משתמש: מנותק/ת
הודעות: 26
נשלח בתאריך: 05 May 2011 בשעה 22:44 | IP רשוּם
ציטוט eyalmen

כתבתי פונקציה שמקבלת מספר (double) ומספר נוסף (גם double) שלהלן ייקרא: דיוק.

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

החישוב נעשה ע"י שימוש בשיטת החיפוש הבינארי בצורה הבאה:

בכל קריאה רקורסיבית של הפונקציה היא שואלת האם ה-middle  (של החיפוש הבינארי) בריבוע נמצא בתחום של: המספר המקורי פחות הדיוק והמספר המקורי פלוס הדיוק.

כאשר החיפוש מתחיל בתחום שבין המספר המקורי לבין המספר 1.

הפונקציה עובדת כמו שצריך אבל מחזירה תשובה מטיפוס double שלעתים קרובות הוא טיפה קטן או גדול יותר מהתשובה הרצויה. לדוגמא עבור המספר 4 תתקבל, עבור דיוק מסויים, התשובה: 1.9.

השאלה שלי היא איך אני מעגל את התשובה כך שתמיד תצא נכונה (לא חייב שהיא תצא בדיוק 2 לצורך העניין, אבל מספיק שיהיה 2 נקודה משהו כך שכשתוחזר התשובה כ-int היא תהיה 2..)

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

 

תודה..

חזרה לתחילת העמוד הצג את כרטיס החבר של eyalmen חפש הודעות אחרות של eyalmen
 
eyalmen
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 02 April 2011
משתמש: מנותק/ת
הודעות: 26
נשלח בתאריך: 05 May 2011 בשעה 22:48 | IP רשוּם
ציטוט eyalmen

להלן מצורף הקוד:

 

double search(double num,double prec,double left,double right) // return sqrt(num) using binary search //

{

double middle;

middle=(right+left)/2;

if((middle*middle>=num-prec)&&(middle*middle<=num+prec))

return middle;

}

if (middle*middle>num+prec)

return search(num,prec,left,middle);

return search(num,prec,middle,right);

}

חזרה לתחילת העמוד הצג את כרטיס החבר של eyalmen חפש הודעות אחרות של eyalmen
 
igendel
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 31 December 2010
מדינה: Israel
משתמש: מנותק/ת
הודעות: 3
נשלח בתאריך: 06 May 2011 בשעה 23:55 | IP רשוּם
ציטוט igendel

הפונקציה שלך לא מחזירה את "השורש בדיוק שנשלח", אלא פשוט מספר שהריבוע שלו נמצא אי-שם בין המטרה מינוס ה"דיוק" לבין המטרה פלוס ה"דיוק". ככל שערך ה"דיוק" הזה גדול יותר, כך הסטיה מהתשובה הנכונה תהיה (בממוצע) גדולה יותר - ולהיפך. בחרת שם מבלבל למשתנה, כי בתכל'ס אין לו ממש קשר למספר הסופי שאתה רוצה להחזיר, רק למטרה.

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

מה עושים? קודם כל, בחיפוש בינארי שכזה אין טעם להשתמש ברקורסיה. לולאה רגילה תעשה את העבודה הרבה יותר מהר וחסכוני.

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

חזרה לתחילת העמוד הצג את כרטיס החבר של igendel חפש הודעות אחרות של igendel בקר בדף הבית של igendel
 
eyalmen
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 02 April 2011
משתמש: מנותק/ת
הודעות: 26
נשלח בתאריך: 07 May 2011 בשעה 09:55 | IP רשוּם
ציטוט eyalmen

קודם כל, אני לא הייתי משתמש ברקורסיה אלא אם הייתי חייב להשתמש. וזה המצב כאן..

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

חזרה לתחילת העמוד הצג את כרטיס החבר של eyalmen חפש הודעות אחרות של eyalmen
 
igendel
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 31 December 2010
מדינה: Israel
משתמש: מנותק/ת
הודעות: 3
נשלח בתאריך: 07 May 2011 בשעה 10:23 | IP רשוּם
ציטוט igendel

אז לפחות תגלה מה עשית... 
חזרה לתחילת העמוד הצג את כרטיס החבר של igendel חפש הודעות אחרות של igendel בקר בדף הבית של igendel
 
eyalmen
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 02 April 2011
משתמש: מנותק/ת
הודעות: 26
נשלח בתאריך: 08 May 2011 בשעה 08:31 | IP רשוּם
ציטוט eyalmen

המספר שהפונקציה מחזירה הוא מסוג דאבל.

בפונקציה שקראה לה, חיסרתי מהתוצאה את הערך ה-int-י שלה ואז קיבלתי שבר עשרוני כלשהו..

שאלתי האם השבר הזה גדול מ-0.5. אם כן עיגלתי כלפי מעלה ואם לא אז כלפי מטה..

חזרה לתחילת העמוד הצג את כרטיס החבר של eyalmen חפש הודעות אחרות של eyalmen
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה