چرا اعداد صحیح کافی نیستند
تمام محاسباتی که پیشتر در این مجموعه پوشش داده شد، اعداد صحیح ذخیرهشده بهعنوان اعداد باینری با عرض ثابت را فرض میکردند. با این حال، بسیاری از محاسبات دنیای واقعی به مقادیر اعشاری و اعدادی که بازه عظیمی از بزرگیها را پوشش میدهند نیاز دارند — از جرم یک الکترون تا فاصله بین کهکشانها — که یک نمایش عدد صحیح ساده نمیتواند بهطور کارآمد آنها را مدیریت کند.
ایده اصلی: نماد علمی در باینری
نمایش Floating Point ایده پشت نماد علمی اعشاری را وام میگیرد، جایی که یک عدد بهصورت مقداری ضربشده در توانی از یک مبنا بیان میشود. در ممیز شناور باینری، یک عدد به سه مؤلفه شکسته میشود که در یک کلمه با عرض ثابت بستهبندی شدهاند:
Sign: یک بیت تکی که نشان میدهد عدد مثبت است یا منفی.Exponent: بزرگی کلی را تعیین میکند، در واقع اینکه ممیز باینری چقدر جابهجا شده است.Fraction(کهMantissaنیز نامیده میشود): ارقام معنادار عدد را نگه میدارد.
از نظر مفهومی، یک مقدار ممیز شناور اینطور تفسیر میشود:
Value = (−1)^Sign × (1.Fraction) × 2^(Exponent − Bias)استاندارد IEEE 754
تقریباً تمام سختافزار امروزی، از جمله RISC-V، از استاندارد IEEE 754 برای نمایش ممیز شناور پیروی میکند، که عرض بیتی و رفتار این فیلدها را دقیقاً تعریف میکند تا نتایج ممیز شناور در پردازندهها و سازندگان مختلف سازگار باشند.
Single Precisionدر مجموع از ۳۲ بیت استفاده میکند: ۱ بیت علامت، ۸ بیت توان، و ۲۳ بیت کسر.Double Precisionدر مجموع از ۶۴ بیت استفاده میکند: ۱ بیت علامت، ۱۱ بیت توان، و ۵۲ بیت کسر، که بازه بسیار گستردهتر و دقت بیشتری به قیمت دو برابر شدن فضای ذخیرهسازی فراهم میکند.
استاندارد همچنین از یک مقدار Bias استفاده میکند که از فیلد توان ذخیرهشده کم میشود، که اجازه میدهد هم بزرگیهای بسیار بزرگ و هم بسیار کوچک بدون نیاز به یک بیت علامت جداگانه برای خود توان نمایش داده شوند.
محدودیتهای دقت و گرد کردن
از آنجا که فقط تعداد ثابتی بیت کسر موجود است، بیشتر اعداد حقیقی نمیتوانند دقیقاً نمایش داده شوند و باید به نزدیکترین مقدار قابلنمایش گرد شوند. این یک پیامد عملی مستقیم دارد: محاسبات ممیز شناور همیشه مانند ریاضیات دقیق رفتار نمیکنند.
مثالی از یک اثر گرد کردن رایج:
0.1 + 0.2 همیشه دقیقاً برابر با 0.3 نیست
در نمایش ممیز شناور، بهدلیل گرد کردن
در طول کدگذاری باینری.این یک نقص سختافزاری نیست بلکه پیامدی ذاتی از نمایش یک بازه بینهایت از اعداد حقیقی با استفاده از تعداد محدودی بیت است.
مقادیر خاص تعریفشده توسط استاندارد
IEEE 754 الگوهای بیتی مشخصی را برای مقادیری که با اعداد معمولی مطابقت ندارند رزرو میکند، از جمله Positive and Negative Infinity، که برای نمایش سرریز استفاده میشود، و NaN (Not a Number)، که برای نمایش نتیجه عملیاتهای نامشخص مانند صفر تقسیم بر صفر استفاده میشود.
چرا درک این موضوع اهمیت دارد
هر برنامهنویسی که با محاسبات مالی، شبیهسازیهای علمی، یا گرافیک کار میکند باید درک کند که مقادیر ممیز شناور خطای گرد کردن ذاتی دارند، و مقایسه دو عدد ممیز شناور برای برابری دقیق اغلب غیرقابلاعتماد است — پیامدی مستقیم از نمایش با بیت محدود که در این مقاله توصیف شد.