نمایش اعداد در استاندارد IEEE 754
به لحاظ تاریخی، کامپیوترهای گوناگون انتخابهای متفاوتی در تعیین مبنا، کرانهای نما و ارقام مانتیسِ نمایش ممیز شناور داشتهاند. در سال 1985 با تلاشهای گروهی متشکل از ریاضیدانان، دانشمندان علوم کامپیوتر و شرکتهای تولید سختافزار به سرپرستی ویلیام کاهان از دانشگاه کالیفرنیا، استانداردی برای نمایش اعداد ممیز شناور تحت عنوان IEEE 754 به سازندگان سختافزارها عرضه شد. هماکنون در بیشتر کامپیوترها از این استاندارد استفاده میشود. استاندارد IEEE، چند قالب کلی با دقتهای مختلف از جمله دقت معمولی، دقت مضاعف و دقتهای معمولی و مضاعف توسعه یافته برای نمایش اعداد ارائه میکند. در اینجا به منظور آشنایی بیشتر با شیوهی نمایش اعداد در این استاندارد، نحوهی نمایش در دقت معمولی و مضاعف را شرح میدهیم.
مبنای در نظر گرفته شده در این استاندارد $\beta=2$ است. مطابق این استاندارد، در دقت معمولی از 32 بیت و در دقت مضاعف از 64 بیت برای نمایش یک عدد استفاده میشود. هر نمایش از سه بخش تشکیل میشود که عبارتند از علامت $(s)$، نمای تعدیل یافته $(c)$ و قسمت کسری مانتیس نرمال شده $(f)$.
این سه بخش با استفاده از روابط زیر مشخص میشوند بهصورت $(s|c|f)$ در کنار هم قرار میگیرند:
دقت معمولی:$$x=\pm(1.f)_{2}\times2^{e}=(-1)^s(1.f)_2\times2^{c-127}$$
دقت مضاعف:$$x=\pm(1.f)_{2}\times2^{e}=(-1)^s(1.f)_2\times2^{c-1023}$$
در دقت معمولی، از 32 بیت اختصاص داده شده برای نگهداری عدد، یک بیت برای علامت $(s)$ استفاده میشود بهطوری که $s=0$ برای علامت مثبت و $s=1$ برای علامت منفی بهکار میرود. از 31 بیت باقیمانده، 8 بیت آن برای نگهداری نمای تعدیل یافته $(c)$ و 23 بیت آن برای قسمت کسری مانتیس نرمال شده $(f)$ استفاده میشود. در دقت مضاعف، از 64 بیت اختصاص داده شده برای نگهداری عدد، یک بیت برای علامت $(s)$ و از 63 بیت باقیمانده، 11 بیت آن برای نگهداری نمای تعدیل یافته $(c)$ و 52 بیت آن برای قسمت کسری مانتیس نرمال شده $(f)$ استفاده میشود.
همانطور که ملاحظه میکنید شکل کلی قالبهای ذکر شده در دقتهای معمولی و مضاعف، کمی شبیه به نمایش ممیز شناور نرمال است. فقط باید توجه داشت که در استاندارد IEEE مانتیس $x$ به صورت $(1.f)_2$ نرمال و تنها قسمتی از مانتیس که با $f$ نشان داده شده است، نمایش داده میشود. در واقع، چون اولین بیت مانتیس نرمال شده همواره برابر با 1 است نیازی به ذخیرهسازی آن نیست. در عوض، این بیت برای نمایش نما مورد استفاده قرار میگیرد.
مثال: عدد $x=-45.75$ را در نظر بگیرید. میخواهیم این عدد را در استاندارد IEEE با دقت معمولی نمایش دهیم. برای این منظور، ابتدا نمایش دودویی آن را مییابیم. داریم $x=-(101101.11)$. حال باید این عدد را به فرم $(1.f)_2\times2^e$ درآوریم: $$x=-(1.0110111)×2^5$$اکنون از این تساوی باید مقادیر s ،f و c را بیابیم. با توجه به قالب کلی دقت ساده داریم:$$s=1,~~ f=0110111,~~e=5=c-127$$ در نتیجه $c=132=(10000100)_2$ و بنابراین:$$x=1|10000100|01101110000000000000000$$مثال: عدد زیر در استاندارد IEEE با دقت معمولی نمایش داده شده است.$$y=0|10000001|10011000000000000000000$$میخواهیم نمایش اعشاری آن را بیابیم. با توجه به نمایش فوق داریم:$$s=0,~~ c=(10000001)_2=129,~~ f=10011$$بنابراین $y$ عددی مثبت است و $e=c-127=129-127=2$. در نتیجه:$$y=+(1.f)_2×2^e=(1.10011)_2×2^2=(110.011)_2=6.375$$ فرمت جدید unum
جان گوستافسون، یکی از متخصصان محاسبات علمی، قالب جدیدی برای نمایش اعداد پیشنهاد کرده است که ضمن صرفهجویی در فضا و انرژی، پاسخهای دقیقتری برای محاسبات ممیز شناور استاندارد فراهم میکند. این قالب جدید میتواند انجام محاسبات عددی ما را به نحو مطلوبی دگرگون سازد. (والتر تیچی)
فرمت unum (universal number) از روی استاندارد IEEE ساخته میشود. مطابق تعریف unum، هر نمایش از شش بخش بصورت زیر تشکیل میگردد: $$s|e|f|u|es-1|fs-1$$
در این قالب:
- s علامت عدد است بهطوری که $s=0$ برای علامت مثبت و $s=1$ برای علامت منفی بهکار میرود.
- e نمای عدد است.
- f قسمت کسری عدد است.
- u بیت عدم قطعیت (uncertainty bit) نام دارد و در صورتی که مقدار بخش کسری دقیق باشد، برابر با 0 وگرنه برابر با 1 است.
- es سایز نما است. مثلا اگر برای ذخیره نما هشت بیت بکار رود es برابر 2(111) خواهد بود.
- fs سایز کسر است. مثلا اگر برای ذخیره کسر بیست و سه بیت بکار رود fs برابر 2(10110) خواهد بود.
برای آشنایی بیشتر با این فرمت، گوستافسون کتابی تحت عنوان «پایان خطا» منتشر کرده است که در انتهای همین پست میتوانید آن را دریافت کنید.
برای اینکه ببینید که فرمت unum تا چه اندازه میتواند در میزان حافظه صرفه جویی کند، نمایش ثابت آووگادرو ($\approx6.022 \times 10^{23}$) را در نظر بگیرید. نمایش این عدد در استاندارد IEEE با دقت مضاعف (64 بیتی) بهصورت زیر است:
0 10001001101 1111111000010101010011110100010101111110101000010011
| | |
| | fraction (hidden bit not shown)
| exponent
|
sign bit
این عدد در فرمت unum به صورت زیر نمایش داده میشود اما این بار با 29 بیت.
0 11001101 111111100001 1 111 1011
| | | | | |
| | | | | frac. size
| | | | |
| | | | exp. size
| | | |
| | | uncertainty bit
| | |
| | fraction (hidden bit not shown)
| |
| exponent
|
sign bit
روش جالبی هست ولی درک کردن روابطی که داره خیلی سخته.