1 00:00:00,000 --> 00:00:00,310 2 00:00:00,310 --> 00:00:01,750 >> DAVID מלאן: בואו עכשיו לפוצץ את דעתך. 3 00:00:01,750 --> 00:00:06,500 מתברר בעולם האמיתי 1 מחולק על ידי 10 הוא אכן 1/10, או 0.1. 4 00:00:06,500 --> 00:00:10,370 אבל במחשבים שיש להם רק סופי מספר הביטים שבה 5 00:00:10,370 --> 00:00:14,290 מייצגים מספרים, אתה לא יכול תמיד מייצג מספרים כמו 1/10 עם 6 00:00:14,290 --> 00:00:15,500 דיוק מושלם. 7 00:00:15,500 --> 00:00:18,640 במילים אחרות, לפעמים יש להם מחשבים כדי לבצע שיחות שיפוט ולא 8 00:00:18,640 --> 00:00:22,740 בהכרח מייצג את המספר שאתה רוצה שבדיוק כמו שאתה מתכוון. 9 00:00:22,740 --> 00:00:27,020 >> לדוגמא, נניח שאני חוזר אל תכנית זו ולשנות את 0.1 ל, 10 00:00:27,020 --> 00:00:32,073 הו, 0.28, ובכך מצביעים על כך אני רוצה printf לprintf כדי 11 00:00:32,073 --> 00:00:34,350 28 מקומות של דיוק. 12 00:00:34,350 --> 00:00:39,330 בואו עכשיו לשמור ולקמפל את התכנית, הפעם עם floats2 איפור. 13 00:00:39,330 --> 00:00:41,910 להפעיל אותו עם floats2 לוכסן נקודה. 14 00:00:41,910 --> 00:00:49,980 ו, אלוהים יקר, זה זמן שאני רואה לא 0.1, אבל 0.10000000, שהוא די 15 00:00:49,980 --> 00:00:51,070 טוב עד כה. 16 00:00:51,070 --> 00:00:57,830 אבל אז, 14901161193847656250. 17 00:00:57,830 --> 00:00:58,880 >> ובכן, מה קורה? 18 00:00:58,880 --> 00:01:02,280 ובכן, מתברר שמצוף הוא מאוחסן בדרך כלל בתוך מחשב 19 00:01:02,280 --> 00:01:03,500 עם 32 סיביות. 20 00:01:03,500 --> 00:01:07,340 32 הוא כמובן מספר סופי, אשר משמעות דבר הוא כי אתה יכול רק לייצג 21 00:01:07,340 --> 00:01:11,050 עם 32 ביטים מספר סופי של ערכי נקודה צפה. 22 00:01:11,050 --> 00:01:14,980 למרבה הצער, זה אומר כי מחשב אינו יכול לייצג את כל אפשרי 23 00:01:14,980 --> 00:01:18,110 מספרי נקודה צפה, או מספרים ממשיים, שקיים בעולם, 24 00:01:18,110 --> 00:01:19,980 כי זה רק לחתיכות כל כך הרבה. 25 00:01:19,980 --> 00:01:23,940 >> ולכן מה שהמחשב זה כנראה נעשה במקרה זה הוא מייצג 1/10 ל 26 00:01:23,940 --> 00:01:26,880 המרחפת הקרובה ביותר האפשרית ערך נקודה שהוא יכול. 27 00:01:26,880 --> 00:01:31,050 אבל אם נסתכל, כמו שיש לנו כאן, ל28 מקומות עשרוניים, אנחנו מתחילים לראות ש 28 00:01:31,050 --> 00:01:31,970 חוסר דיוק. 29 00:01:31,970 --> 00:01:34,480 אז מדובר בבעיה עם אין פתרון מושלם. 30 00:01:34,480 --> 00:01:38,060 אנו יכולים להשתמש כפולים במקום לצוף, אשר נוטה להשתמש 64 סיביות כמו 31 00:01:38,060 --> 00:01:39,410 לעומת 32. 32 00:01:39,410 --> 00:01:42,290 אבל כמובן, 64 הוא גם סופיים, כך שהבעיה תהיה 33 00:01:42,290 --> 00:01:43,630 תישאר גם עם זוגות. 34 00:01:43,630 --> 00:01:46,323