מה זה מה? · bei.pm
בקטגוריה זו ישנם מאמרים על פורמטים של קבצים והנדסה הפוכה.
אבל זה כך:
יש המון שפות תכנות שם בחוץ והרבה אנשים שמכירים דברים מסוימים בשמות שונים לחלוטין - או שאין להם מושג על קיומם של דברים בסיסיים ביותר, כי שפת התכנות שלהם מעבירה את זה מהם.
tl;dr:
ההנחיות שלי מתבססות באופן גס על C99 <stdint.h>
. מי שמבין את ההנחיות הללו, בוודאי יסתדר עם ההנחיות שלי.
שלם
מספרים שלמים הם פשוטו כמשמעו מספרים שלמים, כלומר מספרים ללא חלק שבר.
מספרים שלמים בדרך כלל מוגדרים בפורמטים של נתונים בתוך טווח מספרים קבוע, כלומר רזולוציה. אני מציין זאת בבתים - מכיוון ש"בית" וסוגים המבוססים עליו (מילה, קוורד, ...) בדרך כלל תלויים בפלטפורמה.
בנוסף, מבדילים בין סוגי מספרים שלמים מספרים טבעיים (ℕ, כלומר, ללא סימן - Unsigned) ומספרים שלמים (ℤ, כלומר, עם סימן - Signed).
מידע זה ניתן לראות באמצעות סימן במזהה (u
או s
).
יתכן שמספרים שלמים עם סימן יוצגו או כתוספת אחת או כתוספת שתיים.
כל עוד לא צויין אחרת, תשתמש בתוספת שתיים, מכיוון שהיא מהווה את הייצוג המועדף במדעי המחשב המודרניים.
מספרים ללא סימן מצויינים על ידי uint
במסמכים שלי, עם ציון אחר כך של הדיוק בבתים.
מספרים עם סימן מצויינים על ידי sint
במסמכים שלי, גם עם ציון אחר כך של הדיוק בבתים.
אני מוותר על השימוש בסוג הנתונים "char" עבור תווים, מכיוון ששרשראות תווים בדרך כלל מייצגות רק שרשראות של ערכי שלמים עם פרשנות מיוחדת.
לכן הם מוצגים כ uint(8)[].
דוגמאות:
סימון | מקביל ל-C99 stdint.h |
תיאור | טווח מספרים |
---|---|---|---|
uint(16) | uint16_t | מספר שלם לא חתום, באורך 16 ביט | 0 - 65.535 |
sint(8) | int8_t | מספר שלם חתום, באורך 8 ביט, תוספת של 2 | -126 - 127 |
uint(24) | uint32_t:24 | מספר שלם לא חתום, באורך 24 ביט | 0 - 16.777.216 |
ערכים בקטגוריית עשרוני קבוע
ערכים קבועים הם ערכים מספריים מתוך הספקטרום של מספרים רציונליים (Q), שיש להם נקודה וספרות אחרי הנקודה.
במקרה של ערכים קבועים - ולכן גם השם - מיקום הנקודה מוגדר מראש על ידי סוג הנתונים.
כך מתקבל טווח מספרים קבוע עבור מספרים מסוג נתונים זה; במונחים מתמטיים, טווח המספרים הוא סופי.
במציאות, סוג נתונים זה משמש בעיקר בפלטפורמות ללא יחידת חומרה מהירה מספיק עבור חישובי נקודה צפה, מכיוון שהחישוב של ערכים קבועים יכול להתבצע על ידי יחידות שלמים.
סוג נתונים זה משמש גם, למשל, על ידי מערכות ניהול מסדי נתונים כאשר יש לעמוד בדרישות קבועות.
יש לחשוב על מערכות לשמירה מתמשכת של נתוני כספים; רוב המטבעות מגבילים את עצמם ל-2 ספרות אחרי הנקודה.
(אך לא חכם להשתמש בערכים קבועים לכך; חכם יותר לשמור ישירות את יחידת המטבע הקטנה ביותר כשלם ולהשאיר את שאר רמת הייצוג)
בהקבלה להגדרות שלמים, אני מציין עבור ערכים קבועים את הפתרון של המספר לפני ואחרי הנקודה:
ufixed(9,7)
מתייחס לסוג נתונים, המוקצה ללא סימן 9 ביט לערך לפני הנקודה, ו-7 ביט לערך אחרי הנקודה; סך הכל 16 ביט רחב וכך יכול, למשל, כווקטור של שני שלמים בלתי תלויים לכסות טווח של (0,0) עד (511,127).
עם זאת, פרשנות זו תיתן 28 מספרים בלתי מנוצלים בייצוג העשרוני שלה, שכן סביר להניח שיתמקדו במקסימום (511,99) למעשה.
במקום פרשנות ישירה של ערך קבוע כווקטור של 2 שלמים נפרדים - מה שברוב המקרים תמיד יגרום לאזור נתונים בלתי מנוצל בעת ההמרה למספרים עשרוניים ולמעבר ידני - ניתן גם לפרש את אזור הספרות לאחר הנקודה כשבר של הפתרון הכולל שלה.
בדוגמה של ufixed(9,7)
מתקבל שבר עם מכנה בגובה 27 - אזור המספרים נע בין 0,00 ל-511 + 126⁄127
להמרה לייצוג עשרוני יש לחלק את ספרת השבר ב-128.
עם גרסה זו ניתן לבצע פעולות חישוב פשוטות יותר, מכיוון שהמעבר מתבצע אוטומטית, כך שגרסה זו בדרך כלל מועדפת.
עם זאת, לגרסה זו יש חסרון בכך שספירות השבר בייצוג העשרוני כבר אין להן פתרון מובטח, כך שספירה עשרונית אחת כבר אינה שווה ל0.01
, אלא ל0.007874
, מה שיוביל לטעויות עיגול מתאימות.
איזו שיטת פרשנות משמשת, מתועדת בהתאם למקום השימוש.
ערכי נקודה צפה
מספרי נקודה צפה הם ביטויים מתמטיים מורכבים יותר, שבהם מספר שלם עם רזולוציה קבועה מיוצג באמצעות מונח מתמטי, כך שהחלק העשרוני נוצר על ידי הזזת הערכים - ומכאן נובע שהוא מתייחס ישירות לשיטה המדעית.
הדרך הנפוצה ביותר ליישם זאת הוסדרה עם IEEE 754 והוכרה מאז ברחבי העולם.
בדרך כלל, מספר נקודה צפה מורכב מהמרכיבים הבאים:
סימן (0 או 1 ) |
אקספוננט | מנטיס |
בעוד שהסימן כמידע בינארי של כן/לא ניתן להסיק בקלות, המספר עצמו נוצר דרך המשוואה
מנטיס * 2אקספוננט
בנוסף, ישנם מספר ערכים קבועים המכסים מקרים מיוחדים של מספרים רציונליים - ביניהם ±∞
וNaN
("מספר לא חוקי").
מספרי נקודה צפה שימושיים במיוחד כאשר הדיוק אינו חשוב כל כך, מכיוון שבסוג זה של ערכים ישנם בהכרח שגיאות עיגול ואובדן דיוק. בדרך כלל משתמשים במספרי נקודה צפה, למשל, להגדרת קואורדינטות, כמו וקטורי קודקודים במודלים תלת-ממדיים או קווי Bézier/Spline למטרות ייצוג אופטיות.
בפורמטים נתונים, מספרי נקודה צפה מוגדרים כfloat(מנטיס, אקספוננט)
.
אם נעשה שימוש בפורמט שונה מ-IEEE 754, זה ייצוין בהתאם.