ممیز شناور به زبان ساده
اعداد ممیز شناور، نوعی از دادههای اولیه (Premitive Data Type) هستند که یکی از سادهترین نوع ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده است ها محسوب می شوند. فراسوی اعداد صحیح علامتدار و بیعلامت، زبانهای برنامه نویسی از اعداد اعشاری که در ریاضیات به اعداد حقیقی (Real یا \(\mathbb{R}\)) شهرت دارند، پشتیبانی میکنند. در زیر مثالهایی از اعداد حقیقی آورده شده است:
\[\pi=3.14159265\cdots\]
\[e=2.71828\cdots \]
\[ns={0.000000001}_{ten}\Longrightarrow \underbrace{\left({1.0}_{ten}\times {10}^{-9}\right)}_{\text{نماد}\mathrm{\ }\text{علمی}}\]
\[{3,155,760,000}_{ten}\Longrightarrow \underbrace{\left(3.155,76\times {10}^{+9}\right)}_{\text{نماد}\mathrm{\ }\text{علمی}}\]
عدد آخر با اینکه نمایش عددی اعشاری نیست اما عدد صحیح بزرگی است که نمیتوان آن را به صورت یک عدد علامتدار 32 بیتی نشان داد. راه دیگر برای نمایش دو عدد آخر در مثال فوق استفاده از نماد علمی است که با فلش رو به روی آنها نمایش داده شده که در آن در سمت چپ ممیز اعشار صرفاً یک رقم صحیح وجود دارد. هر عدد در نماد علمی که صفرهای مقدم (Leading zero) در آن نباشد اصطلاحاً عدد نرمالیزه شده (بهنجار شده) نامیده میشود؛ روش موسوم نوشتن اعداد با نماد علمی عموماً شکل بهنجار شده آنهاست. برای مثال \({1.0}_{ten}\times{10}^{-9}\) نمایشِ علمیِ نرمالیزه دارد در حالی که \({0.1}_{ten}\times{10}^{-8}\) و \({10.0}_{ten}\times{10}^{-10}\) دارای شکل نرمال نیست. به همان نحوی که اعداد مبنای 10 دارای نماد علمی هستند، اعداد مبنای دو را نیز میتوان با نماد علمی نمایش داد:
\[{1.0}_{two}\times2^{-1}\]
برای آنکه یک عدد اعشاری دودویی در شکل نرمال باقی بماند به مبنایی نیاز داریم که بتوانیم برای نگه داشتن تنها یک رقم غیر صفر در سمت چپ ممیز اعشار، عدد را به سمت چپ یا راست شیفت بدهیم و در ازای هر تعداد شیفت به راست یا چپ به نمای (Exponent) آن اضافه کرده یا از آن بکاهیم. تنها مبنایی که چنین نیازی را برآورده میکند همان مبنای 2 است. چون نماد علمی در اینجا دیگر مبنای 10 نیست، به جای اصطلاح ممیز اعشار از ممیز دودویی (Binary point) بهره خواهیم گرفت.
آن بخش از حساب کامپیوتری که چنین اعدادی را پشتیبانی میکند اصطلاحاً ممیز شناور نامیده میشود زیرا اعدادی را نمایش میدهد که در آن برخلاف اعداد صحیح، ممیز دودویی جای ثابتی ندارد. مثلا زبان برنامه نویسیبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامهنویسی یکی از پرطرفدارترین شغلهای دنیاست، دغدغهای افرادی که میخواهند در مسیر برنامهنویس شدن قدم بردارند این است که نمیدانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است C برای چنین اعدادی از کلید واژه float بهره گرفته است.
دقیقا همانند نمادِ علمیِ مبنای ده، اعداد با نماد علمی مبنای 2 نیز به گونهای نمایش داده میشوند که تنها یک رقم دودویی در سمت چپ ممیز دودویی قرار بگیرد. در مبنای 2، اعداد در نمادِ علمیِ نرمالیزه به شکل زیر هستند:
\[{1.xxx\cdots x x\ }_{two}\times2^{yyy\cdots y y}\]
داشتن استانداردی برای نماد علمی در شکل نرمالیزه (بهنجار شده) 3 مزیت دارد:
- مبادله دادههایی را که شامل اعداد ممیز شناور نیز هستند، سادهتر میکند.
- دانستن آنکه اعداد همیشه به شکلی استاندارد هستند، الگوریتمآموزش طراحی الگوریتم به زبان سادهدرس طراحی الگوریتم یکی از مهمترین و بنیادیترین دروس رشته کامپیوتر است. هدف از این درس، معرفی روشهای مختلف طراحی الگوریتمها برای حل مسائل گوناگون است، در این صفحه به معرفی و آموزش طراحی الگوریتم پرداخته شده است.های محاسباتی ممیز شناور (مانند جمع و ضرب) را سادهتر خواهد کرد.
- دقت اعدادی را که میتوان در بطن یک کلمه ذخیره کرد افزایش خواهد داد زیرا صفرهای مقدم که غیرضروری هستند حذف شده و به جای آنها ارقام واقعی و حقیقیِ سمت راستِ ممیز دودویی، ذخیره میشود.
در ادامهی مقاله بیشتر راجع به عدد نرمال شده (بهنجار شده) در مبنای دو صحبت خواهیم کرد.
نمایش ممیز شناور (Floating point) - نحوه ذخیره سازی اعداد اعشاری در سیستم ممیز شناور
به طور کلی دو روش برای نمایش اعداد اعشاری در معماری کامپیوتر آموزش جامع معماری کامپیوتر در مهندسی کامپیوتر، معماری کامپیوتر مجموعهای از قوانین و روشهایی است که به چگونگی طراحی، کارکرد، سازماندهی و پیاده سازی (ساخت) سیستمهای کامپیوتری میپردازد، در این صفحه به بررسی و آموزش کامل معماری کامپیوتر پرداخته شده است وجود دارد:
- اعداد ممیز ثابت (Fixed point)
- اعداد ممیز شناور (Floating point)
در مقاله اعداد ممیز ثابت در مورد اعداد ممیز ثابت (Fixed point numbers) صحبت کردیم که در آنها نقطه ممیز در یک محل به صورت ثابت در نظر گرفته میشود. در اعداد ممیز شناور این امکان فراهم است که نقطه ممیز را به صورت شناور در نظر بگیریم. یک عدد ممیز شناور برخلاف عدد ممیز ثابت از دو ثبات تشکیل شده که یکی عدد بدون ممیز و دیگری جای ممیز را نمایش میدهد. هر عدد ممیز شناور از 2 بخش Fixed point به نامهای M و E درست شده که این دو بخش باهم یک عدد را نشان میدهند. E یک Fixed point از نوع integer و M یک Fixed point از جنس fractional است. برای درک بهتر موضوع به شکل زیر توجه کنید.
بهطور کلی عدد ممیز شناور در IEEE استاندارد به صورت \(\mathrm{X\ =\ }{(-1)}^s\times 1.\mathrm{M}\times {\mathrm{B}}^{\mathrm{E}}\) بیان میشود که در آن \(\mathrm{M}\) مانتیس یا مانتیسا (Mantissa) یا Significand، E توان یا نما (Exponent) و S علامت عدد (Sign) را نشان میدهد. به ثابت B پایه (Base) میگویند و معمولاً به همان دلیلی که پیشتر ذکر شد، بصورت توانی از 2 انتخاب میشود. مانتیس یک عدد بدون علامت و نما یک عدد علامتدار است که به صورت مکمل دو یا سیستم بایاس نمایش داده میشود. بنابراین داریم:
\(\mathrm{X\ =\ }{(-1)}^s\times 1.\mathrm{M}\times {\mathrm{B}}^{\mathrm{E}}\)
با انتخاب مقادیر بالا برای فیلد نما و فیلد کسری (مانتیس) کران بسیار بالایی برای محاسبات در کامپیوترها فراهم آمده است. به عنوان مثال با این قالب، اعداد کسری قابل نمایش در کامپیوتر MIPS از اعداد کوچکی در کران \({2.0}_{ten}\times{10}^{-38}\) آغاز و به اعداد بزرگی در کران \({2.0}_{ten}\times{10}^{+38}\) ختم میشود. با این اوصاف به دلیل پهنه نامتناهی اعداد حقیقی، همچنان اعدادی هستند که در چنین فضای در قالب ممیز شناور نمیگنجند. از این رو دقیقاً همانند سرریز در محاسبات صحیح، وقفه ناشی از سرریز در محاسبات ممیز شناور احتمال وقوع دارد.
دقت کنید که سرریز در محاسبات ممیز شناور بدین معناست که نمای عدد آنقدر بزرگ شده و یا آنقدر کوچک شده که در فیلد Exponent قابل نمایش نیست.
نرمال سازی اعداد ممیز شناور
در نسخه ابتدایی، یک عدد ممیز شناور به صورت زیر نمایش داده میشد:
\[X={\left(-1\right)}^S\times M\times B^E\]
که چون مانتیس یک ممیز ثابت از جنس fractional است، در بازهی \(\left[0,1\right)\) قرار میگیرد.
یکی از مشکلات نمایش ممیز شناور به این شکل، افزونگی این سیستم است، به عبارت دیگر برای یک عدد میتوان نمایشهای مختلفی داشت.
مثال: فرض کنید 2 = B است، دو نمایش مختلف ممیز شناور برای عدد 1 ارائه دهید.
\[S\ =\ \circ ,\ \ \ \ \ M\ =\ 1,\ \ \ \ \ E\ =\ \circ \ \Rightarrow \ X\ =\mathrm{\ }{\left(-1\right)}^{\circ }\times 1\ \times 2^{\circ }=\ 1\]
\[S\ =\ \circ ,\ \ \ \ \ M\ =\ 0.5,\ \ \ \ \ E\ =\ 1\ \Rightarrow \ X\ =\mathrm{\ }{\left(-1\right)}^{\circ }\times 0.5\ \times \mathrm{\ }2^1=1\ \]
وجود افزونگی (نمایشهای مختلف برای یک عدد) سبب میشود مقایسه اعداد سخت شده و اتلاف فضا به وجود بیاید. از این رو برای برطرف کردن این افزونگی از نمایش نرمال (Normal) استفاده میکنیم. منظور از نمایش نرمال نمایشی است که در آن رقم پرارزش مانتیس در مبنای r غیر صفر باشد (دقت کنید منظور غیر صفر بودن رقم پرارزش مانتیس است نه بیت پرارزش آن). به همین دلیل عدد ممیز شناور به صورت \(\mathrm{X\ =\ }{(-1)}^s\times 1.\mathrm{M}\times {\mathrm{B}}^{\mathrm{E}}\) بیان میشود.
اگر 4 = r باشد، مانتیس در مبنای 4 نمایش داده میشود و رقمهای مجاز \( \left\{\mathrm{\circ},\ \mathrm{1,\ 2,\ 3}\right\} \) میباشند که نمایش دودویی این رقمها به صورت \(\left\{\mathrm{\circ}\circ,\ \mathrm{01,\ 10,\ 11}\right\}\) خواهد بود. بنابراین اگر رقم پرارزش مانتیس برابر 01 یعنی رقم 1 در مبنای 4 باشد، با وجود \(\mathrm{\circ}\ \) بودن بیت پرارزش مانتیس در مبنای 2، مانتیس همچنان نرمال محسوب میشود.
علت اصلی استفاده از نمایش نرمال شده، جلوگیری از اتلاف فضا است.
پیشتر به این اشاره کردیم که نما یک عدد علامتدار است که به صورت مکمل دو یا سیستم بایاس نمایش داده میشود، اکنون قصد داریم کمی بیشتر راجع به سیستم بایاس صحبت کرده و علت استفاده از آن را بیان کنیم.
ما گفتیم که عدد ممیز شناور به صورت \(\mathrm{X\ =\ }{(-1)}^s\times 1.\mathrm{M}\times {\mathrm{B}}^{\mathrm{E}}\) بیان میشود، اما به این موضوع توجه نکردیم که عدد 0 چگونه به این شکل نمایش داده میشود! مسئله این است که به هیچ طریقی نمیتوان عدد 0 که جز پرکاربردترین اعداد در محاسبات کامپیوتری هست را به این شیوه نمایش داد زیرا کمترین مقدار برای مانتیس که در بازهی \([0,1)\) قرار دارد، 0 است که اگر M=0 قرار دهیم و E نیز برابر کمترین مقدار خود باشد باز عدد 0 ساخته نمیشود. در ابتدا IEEE قرار داد کرد که اگر تمام بیتهای عددمان صفر بود، این نمایش برای 0 باشد. اما این نمایش نیز با مشکل رو به رو شد زیرا اگر تمام بیتها صفر باشند عدد 1 تولید خواهد شد و عدد 1 نیز جز پرکابردترین اعداد در محاسبات کامپیوتری محسوب میشود.
\[\left(-1\right)^0\times1.000\cdots00\times2^0=1\]
برای رفع این مشکل سیستم بایاس را به وجود آوردند. سیستم بایاس اعداد علامتدار را به شکل بدون علامت ذخیره میکند. به این صورت قبل از ذخیره عدد علامتدار، آن را با مقدار Bias که برابر \(2^{n\ -\ 1}\) ( n= تعداد بیتها) جمع کرده و سپس ذخیره میکنند.
مثال: فرض کنید که 3 بیت در اختیار داریم و میخواهیم عدد 3- را در سیستم بایاس نمایش دهیم.
$Bias=2^{3-1}=4\Longrightarrow \ -3\ +\ \underbrace{4}_{Bias}\ =\ +1$ ${{\stackrel{\text{ذخیره}\mathrm{\ }\text{سازی}\mathrm{\ }\text{برای}\mathrm{\ }\text{نمایش}}{\Longrightarrow}}}$ 001
علت این امر که مقدار بایاس را برابر \(2^{n\ -\ 1}\) (n = تعداد بیتها) در نظر میگیرند نیز واضح است؛ زیرا اگر n بیت در اختیار داشته باشیم، اعداد ما در بازهی زیر قرار میگیرند:
\(-2^{n\ -\ 1}\le E\le2^{n\ -\ 1}-\ 1\)
حال اگر به طرفین تساوی مقدار \(2^{n\ -\ 1}\) اضافه کنیم، کلیه اعداد مثبتِ قابل ساخت با n بیت را به صورت مرتب (به منظور ذخیره سازی) خواهیم داشت.
\[-2^{n\ -\ 1}\le E\le 2^{n\ -\ 1}-\ 1{{\stackrel{+2^{n\ -\ 1}\ }{\Longrightarrow}}}\ 0\le E+2^{n\ -\ 1}\le 2^n-1\]
در نتیجه میتوان عدد ممیز شناور نرمال شده بایاس شده را به صورت زیر نمایش داد:
\[{\left(-1\right)}^S\times 1.M\times B^{E\ -\ Bias}\]
پیش از این گفته بودیم که قرار بر این شد که اگر تمامی بیتها صفر باشند، عدد را معادل 0 در نظر میگیریم. این قرار داد در سیستم اعداد ممیز شناور نرمال شده بایاس شده معادل عدد زیر خواهد شد:
\[{\left(-1\right)}^0\times 1.000\cdots 00\times 2^{0\ -\ Bias}=2^{-\ 2^{n\ -\ 1}}\]
در نتیجه عدد 0 را جایگزین عدد \(2^{-\ 2^{n\ -\ 1}}\) کردیم که این امر مشکلی ایجاد نمیکند زیرا میزان استفاده از عدد 0 بسیار بیشتر از عدد \(2^{-\ 2^{n\ -\ 1}}\) است.
دامنه تغییرات اعداد اعشاری
برای به دست آوردن بزرگترین (کوچکترین) عدد مثبت قابل نمایش، باید مانتیس و توان عدد بزرگترین (کوچکترین) مقدار خود را اختیار کنند. به طور کلی فرض میکنیم مبنای نمایش مانتیس r است و برای نمایش مانتیس، m رقم در اختیار داریم که از آن ارقام، f رقم کسری و f - m رقم صحیح است. بنابراین محدوده نمایش اعداد مثبت برابر است با:
\[\underbrace{r^{-f}}_{\text{کوچکترین}\mathrm{\ }\text{عدد}\mathrm{\ }\text{مثبت}\mathrm{\ }\text{قابل}\mathrm{\ }\text{نمایش}\mathrm{\ }\text{در}\mathrm{\ }\text{مانتیس}}\times {\mathrm{B}}^{{\mathrm{E}}_{\mathrm{min}}}\le \mathrm{X\ \le}\ \underbrace{\left(r^{m-f}-r^{-f}\right)}_{\text{بزرگترین}\mathrm{\ }\text{عدد}\mathrm{\ }\text{مثبت}\mathrm{\ }\text{قابل}\mathrm{\ }\text{نمایش}\mathrm{\ }\text{در}\mathrm{\ }\text{مانتیس}}\times {\mathrm{B}}^{{\mathrm{E}}_{\mathrm{max}}}\]
محدوده نمایش اعداد منفی نیز به سادگی با معکوس کردن این محدوده و منفی کردن کرانهها به دست میآید:
\[-\left(\mathrm{r}^{\mathrm{m}-\mathrm{f}}-\mathrm{r}^{-\mathrm{f}}\right)\times\mathrm{B}^{\mathrm{E}_{\mathrm{max}}}\le\mathrm{X\ \le}{-\mathrm{r}}^{-\mathrm{f}}\times\mathrm{B}^{\mathrm{E}_{\mathrm{min}}}\]
هر چقدر تعداد بیتهای توان بیشتر باشد، محدوده نمایش بیشتر میشود.
دقت نمایش ممیز شناور
بیشترین دقت نمایش را به صورت فاصله دو مانتیس متوالی در کوچکترین توان ممکن تعریف میکنیم. بنابراین دقت نمایش برابر است با:
\[\left(\mathrm{r}^{-\mathrm{f}}-0\right)\times\mathrm{B}^{\mathrm{E}_{\mathrm{min}}}=\mathrm{r}^{-\mathrm{f}}\times\mathrm{B}^{\mathrm{E}_{\mathrm{min}}}\]
هر چقدر تعداد بیتهای مانتیس بیشتر باشد، دقت نمایش بیشتر میشود.
مزیت ممیز شناور
همانطور که در ابتدای مقاله اشاره کردیم در بسیاری از موارد ما در محاسباتمان همزمان نیاز به اعداد با دقت بالا و همچنین اعداد با دقت پایین داریم و این در حالیست که حافظه کامپیوتر محدود است و نمیتوانید اعداد را با دقت بینهایت ذخیره کنیم؛ در موارد این چنینی اعداد ممیز ثابت به کارمان نمیآیند زیرا دقت نمایش آنها ثابت است. به همین علت سیستم نمایش ممیز شناور به وجود آمد؛ به عبارت دیگر ما در Floating point دقت مناسب برای هر کاربردی را داریم و در واقع مزیت اصلی سیستم نمایش ممیز شناور نسبت به نمایش ممیز ثابت این است که دقت اعداد کوچک مناسب اعداد کوچک و دقت اعداد بزرگ مناسب اعداد بزرگ است.
جمعبندی
از آنجایی که حافظه کامپیوتر محدود است نمیتوانید اعداد را با دقت بینهایت ذخیره کنیم در نتیجه میبایست از سیستم دیگری به نام سیستم نمایش ممیز شناور برای نمایش اعداد بسیار بزرگ یا بسیار کوچک استفاده کرد. از این رو در این مقاله روی این موضوع تمرکز داشتیم که شما را با نمایش اعداد ممیز شناور و دقت نمایش آن آشنا کنیم تا زمینهی لازم جهت فراگرفتن روش انجام محاسبات در این سیستم را در شما ایجاد کرده باشیم.
منابع
- https://www.konkurcomputer.ir/%D8%AA%D8%B3%D8%AA-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1.html
- Computer System Architecture by Mano, M. Morris
- Computer Architecture: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)
چرا از اعداد ممیز شناور استفاده میکنیم؟
ما در Floating point دقت مناسب برای هر کاربردی را داریم و در واقع مزیت اصلی سیستم نمایش ممیز شناور نسبت به نمایش ممیز ثابت این است که دقت اعداد کوچک مناسب اعداد کوچک و دقت اعداد بزرگ مناسب اعداد بزرگ است.
نحوه ذخیره سازی اعداد ممیز شناور در کامپیوتر چگونه است؟
اعداد ممیز شناور در داخل رجیسترهایی ذخیره میشوند که از 2 بخش Fixed point به نامهای M و E درست شده که این دو بخش باهم یک عدد را نشان میدهند. E یک Fixed point از نوع integer و M یک Fixed point از جنس fractional است. مفصلاً دلیل وجود و کاربرد هر یک از این بخشها در این مقاله توضیح داده شده است.