מספרים מעוגלים
הוצג| English | משמעות |
|---|---|
| floating-point/ˈfləʊtɪŋ pɔɪnt/ | נקודה צפה |
| mantissa/mænˈtɪsə/ | mantissa |
| exponent/ekˈspəʊnənt/ | מעריך |
| normalised/ˈnɔːməlaɪzd/ | נורמליזציה |
| precision/prɪˈsɪʒn/ | דיוק |
| rounding errors/ˈraʊndɪŋ ˈerəz/ | שגיאות עיגול |
| fixed-point/fɪkst pɔɪnt/ | נקודה קבועה |
| overflow/ˌəʊvəˈfləʊ/ | היפל |
| underflow/ˌʌndəˈfləʊ/ | מתחת למינימום |
טיל שפספס ב-600 מטרים
- ב-25 בפברואר 1991 מערך TODO Patriot בד'הראן כשל בחסימת טיל פוגע. 28 חיילים נהרגו.
- המערכת ספרה זמן ברבעוניות של שניה, ול-0.1 אין ייצוג בינארי מדויק: זהו שבר חוזר, שנחתך לפי רוחב הרגיסטר. בכל סימון איבוד חלקי של מיקרושניה.
- לאחר מאה שעות פעילות, השגיאה המצטברת הייתה שליש של שניה, ובשליש של שניה היעד הזז 600 מטרים. החישוב היה נכון בכל שלב בנפרד.
- שיעור זה עוסק בפורמט המספרים העשרוניים הצפים (floating-point), נורמליזציה, ושגיאות הקירוב שהופכות מקרים כאלו לאפשריים.
הפורמט
- לאחסון מספרים אמיתיים בגדלים שונים מאוד, מחשב משתמש בצורה בינארית של סימון מדעי עם שני שדות: mantissa (הספרות המשמעותיות) ו-exponent (המעריך של 2 להכפלה). שניהם מאוחסנים כ-two's complement.
- קראו את המנטסה כשבר בינארי: הביט הראשון אחרי הנקודה שווה $\tfrac12$, הבא $\tfrac14$, ואז $\tfrac18$. לכן
0.1010000הוא $\tfrac12 + \tfrac18 = 0.625$. - עם מעריך
00000010, כלומר $+2$, הערך הוא $0.625 \times 2^2 = 2.5$.

שבר וכוח של 2
בניית מספר מעוגל
הפיכת ביטי המנטיסה והאקספוננט ליצירת ערך, ובדיקה האם הוא תקין.
מספר בעל נקודה צפה מאוחסן כ:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
value = mantissa × 2^exponent — סימון מדעי בינארי, כאשר שני החלקים מאוחסנים בשלבי תוספת (two's complement).
התאם כל חלק בייצוג מספר בעל נקודה צפה לתפקיד שלו.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ערך = Mantissa × 2^Exponent; נורמליזציה מגדילה את הדיוק; ערכים כספיים משתמשים בנקודה קבועה/BCD כדי למנוע עיגול.
דוגמה פתורה: מבין-ספוטניקית למערכת עשרונית
- מספר יש לו מנדה
10110000ומעריך00000011. מצאו את ערכו במערכת העשרונית. - המעריך הוא $+3$. המנדה מתחילה ב-1, ולכן היא שלילית ונקראת לפי חוקי המשלים השניים: כאשר נקראת כ
1.0110000, הביט הסימן שווה $-1$ והביטים השבריים מוסיפים $\tfrac14 + \tfrac18 = 0.375$, ולכן המנדה היא $-1 + 0.375 = -0.625$. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- הטעות הנפוצה ביותר היא לקרוא מנדה שלילית כאילו הייתה חיובית. בדקו את הביט הראשון לפני כל דבר אחר.
למספר נוקף יש Mantissa 10110000 ו-Exponent 00000011. מהו הערך העשרוני שלו?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ה-Mantissa מתחיל ב-1, ולכן הוא שלילי: −1 + 1/4 + 1/8 = −0.625. הכפלה ב-2^3 נותנת −5.0. קריאה של המספר כחיובית היא הטעות הנפוצה ביותר.
דוגמה פתורה: ממערכת עשרונית לבין-ספוטניקית
- אחסנו $+2.5$ באותה מנדה בעלת 8 ביטים, במעריך בעל 8 ביטים.
- בבין-ספוטניקית, $2.5 = 10.1$. כתוב כשבר כפול כוח של 2: $2.5 = 0.101 \times 2^2$.
- לכן המנדה היא
01010000, ביט סימן של 0 ולאחריו.101עם תוספת אפסים (padding), והמעריך הוא00000010. - תמיד כתבו זאת בתחילה בצורת תקנית; אז שני התחומים נקראים ישירות.
כתיבה כשבר נורמליזציה כפול חזקה של שני, 2.5 = 0.101 x 2^__. תן את ה-Exponent.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
2.5 הוא 10.1 במערכת הבינרית; הזזת הנקודה שני מקומות שמאלה נותנת 0.101, ולכן ה-Exponent הוא 2 וה-Mantissa היא 01010000.
נורמליזציה
- מספר הוא תקני כאשר הביט המשמעותי הראשון נמצא מיידית לאחר הנקודה הבינארית, כך שאין אפסים מובילים מבוזבזים. עבור מספר חיובי המנטיסה מתחילה ב-
0.1; עבור מספר שלילי, ב-1.0. - מדוע: זה ממקסם את הדיוק, משום שכל ביט במנדה נושא מידעה ולא אפס מוביל.
- כדי לתקן, הזיזו את המנדה שמאלה והורידו את המעריך באותו מספר מקומות, או הזיזו ימינה והגדילו אותו. הערך אינו משתנה; רק ההצגה שלו.

הזיזו את הביטים, התאימו את המעריך, שמרו על הערך
החלפת ביטי מנדה מול ביטי מעריך
- סך כל הביטים קבוע, ולכן שני השדות מתחרים זה בזה.
- מספר ביטים גדול יותר במנטיסה משמעותו דיוק גבוה יותר: כל ערך מאוחסן בצורה מדויקת יותר, עם טעות עיגול קטנה יותר.
- מספר ביטים גדול יותר באקספוננט משמעותו טווח רחב יותר: ניתן לייצג ערכים גדולים מאוד וקטנים מאוד, אך כל אחד מהם בדיוק פחות.
- שאלה הדורשת את ההשפעה של העברת ביט משדה אחד לשני מכוונה בדיוק למסחר זה: טווח לעומת דיוק.
נורמליזציה של מספר בעל נקודה צפה
תהליך הנורמליזציה: הזזת המנטיסה כדי להסיר אפסים מובילים מיותרים — ולכוון את המעריך בהתאם — שומר על הערך האמיתי אך משקיע כל ביט בדייקנות.
נורמליזציה של מספר נוקף:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הנורמליזציה מזזה את ה-Mantissa כך שהביט המשמעותי הראשון יעבור מיד אחרי הנקודה — כל ביט מייצג מידע, והערך נשאר ללא שינוי.
אילו טיעונים נכון לגבי נורמליזציה של מספר נוקף? סמן את כולם החלים.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
הנורמליזציה משנה רק את ההצגה. הערך נשאר ללא שינוי; זה בדיוק מה ששינוי ה-Exponent מבטיח.
הקרבה והשלכותיה
- מספרים ממשיים רבים לא יכולים להיות מאוחסנים במדויק בבינארי. $0.1$ הוא השבר החוזר $0.000110011\ldots$, ולכן יש לחתוך אותו: הערך המאוחסן קרוב ל-$0.1$ אך לעולם לא שווה לו.
- טעויות עיגול מצטברות לאורך פעולות רבות, ולכן
0.1 + 0.2אינו שווה בדיוק ל-0.3, ולכן שעון הפטריוט הסתה. - לכן לעולם אל תבדוק שוויון בין שני ממשיים: כתוב
ABS(x - 0.3) < 1e-9במקוםx = 0.3. והיזהר מחיסור של שני ערכים כמעט שווים, שכן כך אובדים רוב הספרות המשמעותיות. - עבור ערכים שחייבים להיות מדויקים, בעיקר מטבע, השתמש ב-נקודה קבועה או ב-BCD במקום זאת.
התאם כל שינוי בהקצאת הביתים להשפעה שלה.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
גודל המילה קבוע, ולכן הדיוק והטווח מתחרים זה בזה; התמלאות (overflow) וחוסר תמלאות (underflow) נובעים מכך ששדה האקספוננט נגמר בקצה אחד או השני.
גלישה מעלה וגלישה למטה
- גלישה מעלה (Overflow) מתרחשת כאשר התוצאה גדולה מדי לעומת הטווח של האקספוננט, ולכן לא ניתן לייצג אותה כלל.
- גלישה למטה (Underflow) מתרחשת כאשר התוצאה קטנה מדי, קרובה מדי לאפס כך שהאקספוננט אינו יכול לרדת מספיק נמוך, והיא מעוגלת לאפס.
- שתיהן הן תכונות של גודל שדה האקספוננט, שהוא החלק השני של המסחר הנ"ל.
המספר 0.1 אינו ניתן לאחסון מדויק במערכת בינארית (זוהי שבר חוזר), ולכן חיבור 0.1 + 0.2 אינו נותן בדיוק 0.3 במחשב.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
טעויות הקירוב הקטנות מצטברות — ומכאן ששימוש בכסף מבוסס על נקודה קבועה או BCD, ולא על נקודה צפה.
לחישובי כסף מדויקים יש להשתמש ב:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
טעויות עיגול בנקודה צפה בלתי מקובלות לשימוש במטבע; נקודה קבועה או BCD מאפשרים אחסון ערכים עשרוניים באופן מדויק.
סימונים נופלים מהיד
- המנטיסה היא שבר, לא מספר שלם: הביט הראשון אחרי הנקודה הוא חצי.
- מנטיסה המתחילה ב-1 היא שלילית ועוקבת אחר כללי השלמים השניים. בדוק ביט זה תחילה.
- נורמליזציה מקסימה את הדיוק; היא אינה משנה את הערך, ואינה הופכת את המספר לגדול יותר.
- מנטיסה גדולה יותר משמעותה דיוק, אקספוננט גדול יותר משמעותו טווח. גלישה מעלה היא גדולה מדי, גלישה למטה היא קטנה מדי.
הבנתך מושלמת
- נקודה צפה מאחסנת $\text{mantissa} \times 2^{\text{exponent}}$, גם בשלמים שניים; המנטיסה היא שבר בינארי
- להמרה קראו את המנטיסה כשבר (שלמים שניים אם היא מתחילה ב-1) והכפילו בשתי בחזקת האקספוננט
- נורמליזציה משמעותה שהביט המשמעותי הראשון נמצא מיד אחרי הנקודה, מה ש-מקסים את הדיוק; הזזה שמאלית מורידה את האקספוננט
- יותר ביטי Mantissa נותנים דיוק, יותר ביטי Exponent נותנים טווח; בינארי לא יכול לאחסן מספרים רצוניים רבים בדיוק, לכן צפו שגיאות עיגול, השוו עם סטייה (tolerance), והשתמשו בנקודה קבועה או BCD למטבע