JavaRush /وبلاگ جاوا /Random-FA /داخل یک عدد ممیز شناور چیست و چگونه کار می کند؟
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 بیت تشکیل شده است، اما در ابتدا همیشه واحد دیگری وجود دارد که بیت ها برای آن تخصیص داده نمی شوند. این کار به دلایل مصلحتی و اقتصادی انجام می شود. همین عدد را می توان با اضافه کردن صفر به مانتیس قبل یا بعد از نقطه اعشار در توان های مختلف بیان کرد. ساده ترین راه برای درک این موضوع با یک توان اعشاری است: 120000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8 و غیره. اما با وارد کردن یک عدد ثابت در سر مانتیس، هر بار اعداد جدیدی دریافت خواهیم کرد. بیایید آن را بدیهی بدانیم که قبل از 23 بیت ما یک بیت دیگر با یک بیت وجود خواهد داشت. معمولاً این بیت با یک نقطه از بقیه جدا می شود که البته معنایی ندارد. فقط راحت تر است 1. 11100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 داخل یک عدد ممیز شناور چیست و چگونه کار می کند - 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 را از عدد حاصل کم کنید ، درجه ای را که با آن شروع می کنیم به دست می آوریم. با توجه به mantissa - به 23 بیت موجود در جلو، یک بیت دیگر با مقدار 1 اضافه می کنیم و از آن شروع به افزایش توان دریافتی می کنیم و با هر بیت بعدی این توان را کاهش می دهیم. این همه مردمی، بچه ها! داخل یک عدد ممیز شناور چیست و چگونه کار می کند - 5PS: به عنوان تکلیف، با استفاده از این مقاله، نسخه های خود را در مورد اینکه چرا خطاهای دقیق با تعداد زیادی عملیات حسابی با اعداد ممیز شناور رخ می دهد، در نظرات بگذارید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION