ההבדל בין לצוף כפול - איזה מהם כדאי לי להשתמש? ההבדל בין
(הערה: מאמר זה מניחה שהקוראים יודעים על יסודות מדעי המחשב)
מתכנתים / סטודנטים חדשים רבים שנרשמו למדעי המחשב שואלים את השאלות הנפוצות הרלוונטיות לתחום מסוים במדעי המחשב שהם לומדים. רוב הקורסים מתחילים עם נושאי מערכת המספרים המשמשים את המחשבים המודרניים, כולל בינארי , עשרוני , אוקטלי ו הקסדצימלי < מערכת. אלה הם פורמטים של מספר מחשבים שהם ייצוגים פנימיים של ערכים מספריים במחשבים (או מחשבונים וכל סוג אחר של מחשבים דיגיטליים). ערכים אלה מאוחסנים "קיבוץ של סיביות". -> ->
כפי שאנו מכירים מחשבים מייצגים נתונים במערכות של ספרות בינאריות (כלומר, בשילוב של1s ו- 0s , כגון 1111 מייצג 15 במערכת עשרונית), זה הגיוני ללמד על פורמטים מספר שונים המשמשים לייצג טווח דינמי של ערכים, כי הם מהווים את אבני היסוד של חישוב / מספר עיבוד בכל סוג של פעולה. כאשר מערכת המספרים מוגדרת בכיתה (לעתים קרובות גרוע), התלמידים מתפתים לעבור לפורמטים שונים בתוך אותו סוג (כלומר, אריתמטית נקודה צפה ) שיש להם דיוק מסוים טווח טווח. לכן, הם נאלצים ללמוד את הניואנסים בין סוגים מסוימים. שניים מסוגי הנתונים הנפוצים ביותר הם Float ו- כפול , ובעוד הם מכוונים לאותם צרכים (כלומר, אריתמטית נקודה צפה ), יש די יש הבדל בייצוג הפנימי שלהם והשפעה כוללת על החישוב בתכנית. זה מצער כי מתכנתים רבים מתגעגעים הניואנסים בין סוגי נתונים שטוחים כפולה, ובסופו של דבר misusing אותם במקומות בהם הם לא צריכים לשמש מלכתחילה. בסופו של דבר וכתוצאה מכך misconculations בחלקים אחרים של התוכנית. -> ->
במאמר זה, אני הולך להגיד לך את ההבדל בין לצוף כפול עם דוגמאות קוד שפת התכנות C. בואו נתחיל!Float vs Double … מה העסקה?
Float and Double הם ייצוג הנתונים המשמשים לפעולות חשבון נקודה צפה, לחשוב על מספרים עשרוניים שאתה לחשב בכיתה המתמטיקה, כגון,
20. 123 , 16. 23 , 10. 2 , וכו ', הם אינם מספרים שלמים (כלומר, 2 , 5 , 15 וכו'), ולכן הם דורשים את השיקול של שברים בינארי. כמו מספרים עשרוניים כתוצאה (i, 20. 123 , 16. 23 , וכו ') לא ניתן לייצג בקלות עם פורמט בינארי רגיל (א ', מספר שלם). ההבדל העיקרי בין Float ו- Double הוא שהראשון הוא נתוני נקודה צפה מדויקים (32 סיביות), ואילו השני הוא דיוק כפול (64 סיביות) סוג נתוני נקודה צפה. כפול נקרא "כפול" כי זה בעצם גרסה דיוק כפול של Float. אם אתם מחשבים כמות עצומה (חשבו על אלפים של 0 במספר), אז האי-דיוקים יהיו קטנים יותר, ולא תאבדו הרבה.
#include
int main () {
float num1 = 1. f / 82;
float num2 = 0;
עבור (int i = 0; i <738; + i)
num2 + = num1;
printf ("% 7g n", num2);
כפול num3 = 1. 0/82;
עבור (int i = 0; i <738; + i)
num4 + = num3;
printf ("%. 15g n", num4);
getchar ();
}
הוא מדפיס את הדברים הבאים:
9. 000031
8. 99999999999983
כאן, ניתן לראות שההבדל הקל בדיוק של Float ו- Double מעניק תשובה שונה לגמרי, אם כי כפול נראה מדויק יותר מ- Float.
->
להלן דוגמה של פונקציה sqrt () ב C:#include
#include
int main () <
צף num1 = sqrt (2382719676512365 1230112312312312);
כפול num2 = sqrt (2382719676512365 1230112312312312);
printf ("% f n", num1);
printf ("% f n", num2);
getchar ();
}
הוא נותן את הפלט הבא:
48813108. 000000
48813109. 678778
כאן, אתה יכול לראות את התשובה כפולה יש דיוק יותר.
בסך הכל, עדיף להשתמש פעמיים עבור חשבון נקודה נקודה, כמו כמה פונקציות מתמטיקה סטנדרטי ב- C לפעול על מחשבים כפולה ומודרנית הם מאוד מהיר ויעיל עבור חישובים פעמיים נקודה צפה. זה מוביל לצמצום הצורך להשתמש ב- Float, אלא אם אתה צריך לפעול על מספר רב של נקודות נקודה צפה (לחשוב על מערכים גדולים עם אלפי 0 של מספרים) או שאתה פועל על מערכת שאינה תומכת פעמיים, דיוק נקודה צפה, כמו GPUs רבים, התקנים מופעל נמוך פלטפורמות מסוימות (ARM Cortex-M2, Cortex-M4, וכו ') אינם תומכים פעמיים עדיין, אז אתה צריך להשתמש Float. בנוסף, דבר אחד שיש לזכור הוא כי GPUs / מעבדים מסוימים עובדים טוב יותר / יעיל בעיבוד Float, כמו בחישוב של וקטורים / מטריקס, לכן ייתכן שיהיה עליך לחפש במדריך חומרה / תיעוד כדי להחליט טוב יותר איזה מהם אתה צריך להשתמש עבור מכונה מסוימת.
לעתים רחוקות יש סיבה להשתמש ב- Float במקום ב- Double בקוד המכוון למחשבים מודרניים. הדיוק הנוסף ב- Double מפחית, אך אינו מבטל, את הסיכוי לשגיאה של שגיאות או אי-דיוקים אחרים העלולים לגרום לבעיות בחלקים אחרים של התוכנית. פונקציות מתמטיות רבות או אופרטורים להמיר ולהחזיר כפול, אז אתה לא צריך להפיל את המספרים בחזרה Float, כמו זה עלול לאבד את הדיוק.לקבלת ניתוח מפורט על נקודה צפה נקודה, אני מאוד ממליץ לך לקרוא את המאמר הזה מדהים (// מסמכים.
סיכום
אז … בקיצור:
מקומות שבהם אתה צריך להשתמש Float:
אם אתה מיקוד חומרה שבה דיוק יחיד הוא מהיר יותר מאשר דיוק כפול.
- היישום שלך עושה שימוש רב של נקודה צפה נקודה, כמו אלפי מספרים עם אלפי 0 של.
- אתה עושה אופטימיזציה ברמה נמוכה מאוד. לדוגמה, אתה משתמש בהוראות מיוחדות של CPU (i, SSE, SSE2, AVX וכו ') שפועלים במספר רב של מערכים / מערכים / וקטורים בכל פעם.
- -> ->
במאמר זה יש להדגיש את ההבדל בין Float ו פעמיים, ואשר אחד צריך לשמש במקומות ספציפיים. ניתן לטעון, עדיף להשתמש כפול ברוב מקומות בעיוורון, במיוחד אם אתה מיקוד מחשבים מודרניים, כמו הסיכויים של יעילות נמוכה בשל השימוש בחשבון פעמיים נקודה צף הוא מאוד לא סביר. אם יש לך שאלות, אז אתה יכול לשאול בסעיף ההערה להלן!
-> -