Ali Shobeyri
Ali Shobeyri
خواندن ۵ دقیقه·۲ سال پیش

الگورتیم اعداد Float

کامپیوتر برای محاسبه مقدار اعداد سیستم متفاوتی نسبت به ما داره، اجداد ما از مبنای ده برای شمارش استفاده می‌کردند (به دلیل اینکه 10 انگشت داریم) و به طور کلی این عدد یک عدد خاص در فرهنگ های مختلف به حساب میاد، مثلا موسی 10 قانون از سمت خداوند به مردم ابلاغ کرد یا ... ، اما کامپیوتر که بر مبنای عدد 2 کاراشو انجام میده سیستم متفاوتی رو داره.

اصلا این کلمه Float یعنی چی ؟ در واقع عبارت کامل Floating Point هست به معنی ممیز شناور ! ما به دو صورت این اعداد رو داریم، یا Float یا Double که در واقع Double هم به معنی Double precision به معنی "دقت دو برابر" هست، اعداد float در حافظه 32 بیست جا می‌گیرند و Double ها 64 بیت !

برای دوستانی که نمی‌دانند، اون IEEE رو به صورت
برای دوستانی که نمی‌دانند، اون IEEE رو به صورت


و فرمول محاسبه هم به این صورت خواهد بود :

خب ! حالا هر کدوم از اینا یعنی چی ؟ Sign که مشخصا برای مثبت منفی بودن به کار میره که اگر صفر باشه یعنی مثبت و یک یعنی منفی ، قسمت دوم که ترجمه اش کردیم "توان" عبارتی هست که می‌تونه منفی با مثبت باشه، این قسمت 8 بیت هست، با هشت بیت در مبنای 2 ماکسیمم بشه عدد 1-256 یا همون 255 رو ساخت و مینمم عدد صفر ، حالا اگه یک مقدار ثابت (bias) رو ازش کم کنیم و این مقدار ثابت رو 127 ( که در واقع هست دو به توان هفت منهای یک) قرار بدیم یک range جدید داریم که از 127- تا 128 رو ساپورت می‌کنه ! حالا چرا این کار رو می‌کنیم ؟ در واقع ما با این کار داریم مکمل 2 این عدد رو به دست میاریم، به طور کلی کامپیوتر وقتی بخواد یک عدد Integer رو حساب کنه به این صورت عمل میکنه :

این روش خیلی هم عالیه، منتها اینجا برای Exponent مشکلی پیش بیاد، در این روش مثلا در این مثال 4 بیتی (عکس بالا) ما range اعدادمون از 8- تا 7 هست و اگه اعداد رو به ترتیب بنویسن به صورت صعودی نیستن ، اما ترجیح ما برای Exponent اینه که اعداد مثبت بیشتری داشته باشیم و راحت هم بتونیم دو تا عدد رو بیت به بیت مقایسه کنیم ، پس این روش به درد نمی‌خوره، ما به جای استفاده از این روش فرض می‌کنیم که اعداد ما از روش مکمل 2 استفاده نمی‌کنند و همون روش عادی رو استفاده می‌کنند :

الان range اعداد ما از صفر تا 15 خواهد شد (در مثال 4 بیتی) حالا ما یک مقدار به نام offset of bias رو از این مقدار باید کم کنیم که اعداد منفی رو هم داشته باشیم، فرض کنیم مقدار bias برابر دو به توان سه یعنی 8 باشه (یعنی ارزش توانی پرارزش ترین بیت) که اون وقت range ما مثل همون مکمل 2 میشه از 8- تا 7 (فرقش با مکمل دو این میشه که ترتیب اعداد تفاوت می‌کنند، یعنی در مکمل 2 در مثال 4 بیتی اعداد از صفر تا هفت میره بعد یهو میشه منفی هشت و تا منفی یک میره، اما در این یکی روش اعداد به ترتیبت صعودی از منفی هشت تا مثبت هفت میره)، برای این تعداد اعداد مثبت رو بیشتر کنیم به جای دو به توان سه، دو به توان سه منهای یک رو استفاده می‌کنیم تا یک عدد مثبت بیشتر داشته باشیم ! مزیت دیگه این روش همون قضیه ای هست که در پارنتز نوشتم ، در این روش چون اعداد به ترتیب نوشته شدند کامپیوتر راحت تر مقایسه رو انجام میده و برای مقایسه می‌تونه بیت به بیت راحت بفهمه کدوم عدد بزرگتره !

حالا تنها چیزی که باقی مونده Mantissa هست، بیت های مربوط به Mantissa در واقع یک عدد رو در مبنای 2 نشون می‌دن که این عدد به عنوان اعشار تلقی میشه ! یعنی چی ؟ یعنی مثلا اگه Mantissa برابر 010 باشه در واقع حاصل نمیشه 2 ، بلکه حاصل میشه 0.25، حالا این عدد Mantissa رو با یک باید جمع ببیندیم تا بشه 1.25 و بعد در فرمول جایگذاری کنیم . حالا متوجه شدید چرا به این اعداد "ممیز شناور" می‌گن ؟ چون محل و مکان ممیز بر اساس Exponent محاسبه میشه و می‌تونه هر جایی از Mantissa قرار بگیره !

یک مثال ببینیم :

با این مثال می‌تونید قدرت ممیز شناور رو ببینید، این عدد در واقع خیییییلی کوچیکه ولی سیستم ممیز شناوری قادر به محاسبه اون هست !

حالا برعکس این رویه چی میشه ؟ الان شما یاد گرفتید عدد ممیز شناور رو سیستم ده دهی خودمون تغییر بدید) ولی برعکسش یعنی ده دهیی به ممیز شناور چی ؟ خب باید همین کار رو برعکس انجام بدید !!! فرض کنید عدد 5/3125 رو می‌خوایم به این صورت بنویسیم .

اول که باید ببینید عدد منفی هست یا مثبت که Sign bit مشخص بشه ، بعدش عدد رو در مبنای دو بنویسید (بدون در نظر گرفتن منفی بودن)، حالا باید ممیز این عدد رو تغییر بدید، یعنی مثلا عدد ذکر شده در مبنای دو که میشه 101/0101رو باید جوری عوض کنید که قسمت چپ ممیز فقط یه دونه یک باشه یعنی این طوری 1/010101 که در واقع با تقسیم کردن عدد اصلی به 4 (دو به توان دو) این عدد جدید رو به دست آوردیم، Exponent چی میشه ؟ گفتیم تقسیم بر دو به توان دو یعنی این توان دو معادل همون Exponent هست ، منتها باید bias رو هم دخیل کنیم، حالا این بار چون داریم رویه رو برعکس انجام می‌دیم به جای کم کردن bias باید این مقدار رو بهش اضافه کنیم ، یعنی 2 + 127 که میشه 129 که اگه صورت مبنا دو بنویسیمش میشه : 10000001 حالا با وصل کردن این بیت ها به هم عدد رو داریم :

حالا بالاتر گفتیم این قضیه برای اعداد Float هست، برای Double ها هم دقیقا همینه فقط با توجه به اینکه مقدار بیت ها بیشتر شده bias تغییر می‌کنه (که اگه مقاله رو فهمیده باشید خودتون می‌تونید متوجه بشید bias اون‌ها چند میشه) .

آدرس کانال تلگرامی ما : لینک

من رو در لینکدین ، اینستاگرام و یوتیوب دنبال کنید !!!


اعداد floatبرنامه نویسیکامپیوترprogrammingcomputer
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید