روزبه شریف‌نسب
روزبه شریف‌نسب
خواندن ۳ دقیقه·۴ سال پیش

حل یک مثال IEEE 754 (ممیز شناور)

اخیرا با سایت keysleft.com آشنا شدم. این سایت با گرفتن سن و سرعت تایپ شما، محاسبه می‌کنه تا آخر عمرتون حدودا چند تا کلید کیبورد دیگه خواهید زد. خود این تعداد اهمیت خاصی نداره، بیشتر جنبه نمادین داره که عمرمون رو پای چی می‌گذاریم. توصیه‌ش هم اینه که به جای نوشتن جواب ایمیل، همون جواب رو (اگه جنبه عمومی داره) به شکل وبلاگ در بیارید تا بعدا قابل ارجاع دادن باشه و خلاصه قابل استفاده مجدد باشه و نخواید کل جواب رو از اول تایپ کنید. (برای من این ایده رو داشت که سرعت تایپتون هم بالا ببرید!)

حالا به خاطر همین موضوع، یک مثال IEEE 754 که قبلا توی ایمیل حل کردم رو اینجا قرار میدم تا اگر کسی خواست استفاده کنه. شاید هم این رو دارید می‌خونید چون خودم بهش ارجاع دادم قبلا.


این مطلب با این فرض نوشته شده که با کلیات IEEE 754 (سیستم ممیز شناور) آشنایی دارید و صرفا یک مثال اضافی برای تثبیت مطلب است.

صورت سوال!
صورت سوال!


خب سوال رو با هم بررسی می‌کنیم:  یک عدد در مبنای 16 داده و گفته IEEE 754 با دقت معمولی (32 بیت) هست، ما باید تبدیل کنیم به معادلش در  مبنای 10 و مبنای ۲ (توجه کنید که b نشان دهنده‌ی binary و d نشان دهنده‌ی decimal یا مبنای 10 است)

ما یک قاعده داریم که چطوری می‌تونیم یک رشته 32 بیتی (یعنی 32 تا صفر و یک) رو به معادل باینریش تبدیل کنیم (همون استاندارد IEEE 754 برای مثال میگه بیت اول نشون دهنده علامته و غیره..)

استاندارد IEEE754
استاندارد IEEE754


حالا برای اینکه بتونیم از این قاعده استفاده کنیم، باید اول عدد مبنای 16مون رو ببریم به مبنای 2، برای اینکار از روش تبدیل مستقیم استفاده می‌کنیم یعنی هر رقم رو به 4 رقم در مبنای ۲ تبدیل می‌کنیم.

از سمت چپ شروع می‌کنیم:

4 می‌شود : ‌0100

1 می‌شود: 0001

و A که معادل 10 است می‌شود :‌ 1010

و مابقی صفر هستند که هرکدام به 4 صفر تبدیل می‌شود.

توجه خیلی مهم: عددی که ما در مبنای 16 داشتیم در واقع فقط یک نمایش از رشته صفر و یک ما بود و خودش مستقلا معنی عددی نداشت، یعنی اینطوری نیست که بگوییم عدد ما معادل 1 میلیارد و 101 میلیون است، چون این نمایش مبنای 16 فقط هدف و کارکردش نمایش ساده (و خلاصه‌ی) رشته 32 بیتی از صفر و یک است.

خب در این مرحله با کنار هم گذاشتن صفر و یک های بالا به یک رشته 32 بیتی از صفر و یک رسیدیم :‌

0100-0001-1010-0000-0000-0000-0000-0000

حالا در این مرحله باید طبق قاعده‌ی IEEE 754 32 bit تبدیل را انجام دهیم:

بیت اول برای علامت : 0 پس عدد نهایی ما مثبت است

8 بیت بعدی برای exponent + bias :

(یاد آوری: برای نگهداری exponent از شیوه پیش‌قدر دار استفاده می‌شود)

100000011  که بیانگر عدد 131 است، طبق قاعده باید 127 تا از حاصل کم کنیم تا به exponent  واقعی برسیم. (طبق استاندارد مذکور، مقدار bias برای 32 بیت، 127 است)

با کم کردن 127 از 131 مقدار 4 برای exponent به دست می‌اید.

در نهایت 23 بیت باقی‌مانده، fraction یا mantissa هستند.

این عدد را عینا قرار است استفاده کنیم.

حال که ۳ بخش لازم برای تشکیل عدد اعشاری ما به دست آمد، باید طبق قاعده‌ی IEEE 754 جلو برویم:

عدد اعشاری را با نمایش علمی تشکیل می‌دهیم:

( 1.F ) * 2 ^ (e)

که F همان fraction ماست :

0100000000000000000000

و e همان exponent ماست که ۴ است.

در این مرحله عدد ما این است:

(1.01) * 2 ^ (4)

توجه داریم که صفرهای بعد از اعشار حذف شدند.

حالا برای تبدیل نماد علمی به مبنای ۲ معمولی، کافیست علامت ممیز را 4 رقم به سمت راست حرکت دهیم:

(1.01) * 2 ^ (4) = 10100

عدد ما یک عدد صحیح شد (چون رقمی بعد از ممیز ندارد)

این عدد همان جواب ما در قسمت b است

برای تبدیل به مبنای 10 یا دسیمال به این صورت عمل می‌کنیم:

از سمت راست رقم ها را در توان متناسب از ۲ ضرب می‌کنیم

برای اولین رقم ضربدر  ۲ به توان ۰ ، برای دومین رقم ۲ به توان ۱ و الی آخر

(0) * 2 ^ (0) = 0

(0) * 2 ^ (1) = 0

(1) * 2 ^ (2)  = 4

(0) * 2 ^ (3) = 0

(1) * 2 ^ (4) = 16

اکنون با جمع کردن 16 و 4 به عدد در مبنای 10 می‌رسیم: 20


همچنین توصیه می‌کنم برای توضیح بیش‌تر سیستم IEEE 754 این مطلب :‌

https://www.geeksforgeeks.org/ieee-standard-754-floating-point-numbers/

و این ویدیو را ملاحظه بفرمایید.

https://youtu.be/TZI6Fd4WmIs

برنامه نویسی
همینجا بگم که روزبه شریف نسب درسته و نه شریف نصب یا شریفی نسب یا هرچیز غلط دیگه..
شاید از این پست‌ها خوشتان بیاید