JavaRush /בלוג Java /Random-HE /מה יש בתוך מספר נקודה צפה ואיך זה עובד?
Ivan
רָמָה
Харьков

מה יש בתוך מספר נקודה צפה ואיך זה עובד?

פורסם בקבוצה

תוֹכֶן:

תמונה: http://pikabu.ru/

מבוא

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

טיול אל ההיסטוריה

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

פורמט מספר נקודה צפה

אפילו בספרי הלימוד, כולם עמדו בפני דרך יוצאת דופן לכתוב מספרים גדולים מאוד או קטנים מאוד בצורה 1.2 × 10 3 או 1.2 E3 , ששווה ל -1.2 × 1000 = 1200 . זה נקרא שיטת הסימון האקספוננציאלי. במקרה זה, עסקינן בביטוי של מספר באמצעות הנוסחה: N=M×n p , שבו
  • N = 1200 - המספר המתקבל
  • M = 1,2 - מנטיסה - חלק חלקי, מבלי לקחת בחשבון הזמנות
  • n = 10 הוא בסיס הסדר. במקרה זה וכאשר איננו מדברים על מחשבים, הבסיס הוא המספר 10
  • p = 3 - דרגת בסיס
לעתים קרובות, מניחים שבסיס הסדר הוא 10 ורק המנטיסה וערך הבסיס נכתבים, ומפרידים ביניהם באות E. בדוגמה שלנו, נתתי ערכים שוות ערך 1.2 × 10 3 ו -1.2 E3 אם הכל ברור, וסיימנו את הטיול הנוסטלגי לתוכנית הלימודים בבית הספר, אז עכשיו אני ממליץ לשכוח את זה, כי כשיוצרים מספר נקודה צפה אנחנו עוסקים חזקות שתיים, לא עשרות, כלומר. n = 2 , כל הנוסחה ההרמונית 1.2E3 מתפרקת וזה ממש שבר לי את המוח.

סימן ותואר

אז מה יש לנו? כתוצאה מכך, יש לנו גם מספר בינארי, המורכב ממנטיסה - החלק שנעלה לחזקה ומהחזקה עצמה. בנוסף, בדיוק כפי שמקובל בסוגי מספרים שלמים, למספרי נקודה צפה יש מעט שקובע את הסימן - האם המספר יהיה חיובי או שלילי. כדוגמה, אני מציע לשקול את הסוג float, המורכב מ-32 סיביות. עם מספרי דיוק כפול doubleההיגיון זהה, רק שיש פי שניים יותר ביטים. מבין 32 הסיביות, הראשון המשמעותי ביותר מוקצה לסימן, 8 הסיביות הבאות מוקצות למעריך - העוצמה אליה נעלה את המנטיסה, ו-23 הסיביות הנותרות - למנטיסה. כדי להדגים, בואו נסתכל על דוגמה: מה יש בתוך מספר נקודה צפה וכיצד זה עובד - 1החלק הראשון פשוט מאוד. אם הערך של הביט הראשון הוא 0 , אז המספר שנקבל יהיה חיובי . אם הביט הוא 1 , אז המספר יהיה שלילי . הבלוק הבא של 8 ביטים הוא בלוק מעריך. המעריך נכתב כמספר רגיל של שמונה סיביות , וכדי לקבל את המידה הנדרשת עלינו להחסיר מהמספר המתקבל 127. במקרה שלנו, שמונה הסיביות של המעריך הן 10000001 . זה מתאים למספר 129 . אם יש לך שאלה כיצד לחשב זאת, התמונה מציגה תשובה מהירה. ניתן לקבל גרסה מורחבת בכל קורס אלגברה בוליאנית. מה יש בתוך מספר נקודה צפה וכיצד זה עובד - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 לא קשה לחשב שהמספר המקסימלי שנוכל לקבל מ-8 סיביות אלו הוא 11111111 2 = 255 10 (הערך המשנה 2 ו -10 פירושם מערכות מספרים בינאריות ועשרוניות) עם זאת, אם נשתמש רק בערכי מעריך חיוביים ( מ-0 עד 255 ), אז למספרים המתקבלים יהיו מספרים רבים לפני הנקודה העשרונית, אבל לא אחרי? כדי לקבל ערכים שליליים של התואר, עליך להחסיר 127 מהמעריך שנוצר . לפיכך, טווח המעלות יהיה בין -127 ל-128 . בעזרת הדוגמה שלנו, התואר הנדרש יהיה 129-127 = 2 . בואו נזכור את המספר הזה לעת עתה.

מַנטִיסָה

עכשיו לגבי המנטיסה. הוא מורכב מ-23 סיביות, אך בהתחלה תמיד ישנה יחידה נוספת מרומזת, עבורה הסיביות לא מוקצות. זה נעשה מטעמי כדאיות וחיסכון. ניתן לבטא אותו מספר בחזקות שונות על ידי הוספת אפסים למנטיסה לפני או אחרי הנקודה העשרונית. הדרך הקלה ביותר להבין זאת היא עם מעריך עשרוני: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8 וכו'. עם זאת, בהזנת מספר קבוע בראש המנטיסה, נקבל בכל פעם מספרים חדשים. בואו ניקח את זה כמובן מאליו שלפני 23 הביטים שלנו יהיה עוד אחד עם אחד. בדרך כלל הקטע הזה מופרד מהשאר על ידי נקודה, אשר, עם זאת, לא אומר כלום. זה פשוט יותר נוח 1. 11100000000000000000000000 מה יש בתוך מספר נקודה צפה ואיך זה עובד - 3כעת יש להעלות את המנטיסה המתקבלת לעוצמה משמאל לימין, ולהקטין את העוצמה באחד עם כל צעד. נתחיל בערך החזקה שקיבלנו כתוצאה מהחישוב, כלומר 2 (בחרתי בכוונה דוגמה פשוטה כדי לא לכתוב כל ערך בחזקת שתיים ולא חישבתי אותם בטבלה למעלה כאשר הביט המקביל הוא אפס) מה יש בתוך מספר נקודה צפה ואיך זה עובד - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0.5 = 4+2+1+0.5 = 7.5 וקיבל את התוצאה 7.5 , ניתן לבדוק נכונות, למשל, בקישור הזה

תוצאות

מספר נקודה צפה סטנדרטית floatמורכב מ-32 סיביות, הסיביות הראשונה היא הסימן (+ או -), השמונה הבאים הם המעריך, 23 הבאים הם המנטיסה לפי סימן - אם סיבית 0 היא מספר חיובי. אם סיביות 1 שלילית. על ידי אקספוננציאלי - אנו ממירים סיביות למספר עשרוני (הסיבית הראשונה משמאל היא 128 , השנייה היא 64 , השלישית היא 32 , הרביעית היא 16 , החמישית היא 8 , השישית היא 4 , השביעית היא 2 , השמינית היא 1 ), נחסר 127 מהמספר המתקבל , נקבל את המידה שבה נתחיל. לפי המנטיסה - ל-23 הביטים הקיימים מלפנים נוסיף עוד ביט עם הערך 1 וממנו מתחילים להעלות להספק שקיבלנו, מורידים את ההספק הזה עם כל ביט עוקב. זה הכל אנשים, ילדים! מה יש בתוך מספר נקודה צפה וכיצד זה עובד - 5נ.ב.: כשיעורי בית, באמצעות מאמר זה, השאירו בתגובות את הגרסאות שלכם מדוע מתרחשות שגיאות דיוק עם מספר רב של פעולות אריתמטיות עם מספרי נקודה צפה
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION