מה זה מה? · bei.pm

הטקסט הזה תורגם באופן אוטומטי על ידי OpenAI GPT-4o Mini

בקטגוריה זו ישנם מאמרים על פורמטים של קבצים והנדסה הפוכה.

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

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 + 126127 להמרה לייצוג עשרוני יש לחלק את ספרת השבר ב-128.
עם גרסה זו ניתן לבצע פעולות חישוב פשוטות יותר, מכיוון שהמעבר מתבצע אוטומטית, כך שגרסה זו בדרך כלל מועדפת.
עם זאת, לגרסה זו יש חסרון בכך שספירות השבר בייצוג העשרוני כבר אין להן פתרון מובטח, כך שספירה עשרונית אחת כבר אינה שווה ל0.01, אלא ל0.007874, מה שיוביל לטעויות עיגול מתאימות.

איזו שיטת פרשנות משמשת, מתועדת בהתאם למקום השימוש.

ערכי נקודה צפה

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

בדרך כלל, מספר נקודה צפה מורכב מהמרכיבים הבאים:

סימן (0 או 1) אקספוננט מנטיס

בעוד שהסימן כמידע בינארי של כן/לא ניתן להסיק בקלות, המספר עצמו נוצר דרך המשוואה
מנטיס * 2אקספוננט

בנוסף, ישנם מספר ערכים קבועים המכסים מקרים מיוחדים של מספרים רציונליים - ביניהם ±∞ וNaN ("מספר לא חוקי").

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

בפורמטים נתונים, מספרי נקודה צפה מוגדרים כfloat(מנטיס, אקספוננט).
אם נעשה שימוש בפורמט שונה מ-IEEE 754, זה ייצוין בהתאם.