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

اعداد صحیح نمی‌توانند مقادیر اعشاری یا بازه عظیم بزرگی‌هایی که محاسبات علمی و مالی نیاز دارند را نمایش دهند. این مقاله توضیح می‌دهد اعداد ممیز شناور چگونه یک علامت، توان و کسر را در تعداد ثابتی بیت مطابق با استاندارد IEEE 754 کدگذاری می‌کنند، و مبادلات دقت و مسائل گرد کردن که با این روش نمایش اعداد حقیقی همراه است را پوشش می‌دهد.

دقت و گرد کردنممیز شناوراستاندارد IEEE 754

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۱۵ شهریور ۱۴۰۵

چرا اعداد صحیح کافی نیستند

تمام محاسباتی که پیش‌تر در این مجموعه پوشش داده شد، اعداد صحیح ذخیره‌شده به‌عنوان اعداد باینری با عرض ثابت را فرض می‌کردند. با این حال، بسیاری از محاسبات دنیای واقعی به مقادیر اعشاری و اعدادی که بازه عظیمی از بزرگی‌ها را پوشش می‌دهند نیاز دارند — از جرم یک الکترون تا فاصله بین کهکشان‌ها — که یک نمایش عدد صحیح ساده نمی‌تواند به‌طور کارآمد آن‌ها را مدیریت کند.

ایده اصلی: نماد علمی در باینری

نمایش 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)، که برای نمایش نتیجه عملیات‌های نامشخص مانند صفر تقسیم بر صفر استفاده می‌شود.

چرا درک این موضوع اهمیت دارد

هر برنامه‌نویسی که با محاسبات مالی، شبیه‌سازی‌های علمی، یا گرافیک کار می‌کند باید درک کند که مقادیر ممیز شناور خطای گرد کردن ذاتی دارند، و مقایسه دو عدد ممیز شناور برای برابری دقیق اغلب غیرقابل‌اعتماد است — پیامدی مستقیم از نمایش با بیت محدود که در این مقاله توصیف شد.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

اصول کش: حافظه کوچک و سریع چگونه پیش‌بینی می‌کند بعداً چه چیزی نیاز است

یک کش فقط به این دلیل کار می‌کند که برنامه‌ها تمایل دارند داده یکسان یا نزدیک به هم را به‌طور تکراری دسترسی کنند نه به‌صورت تصادفی. این مقاله اصل محلیت که کش را مؤثر می‌کند را توضیح می‌دهد، یک کش مستقیم‌نگاشت‌شده چگونه داده را با استفاده از یک آدرس مکان‌یابی می‌کند، و در یک hit کش در مقابل یک miss کش چه اتفاقی می‌افتد.

ادامه

سلسله‌مراتب حافظه: چرا کامپیوترها از چند نوع حافظه استفاده می‌کنند

هیچ فناوری حافظه واحدی هم‌زمان سریع، بزرگ، و ارزان نیست. این مقاله مفهوم سلسله‌مراتب حافظه که چند فناوری حافظه مختلف را ترکیب می‌کند تا به سرعت سریع‌ترین آن‌ها با هزینه ارزان‌ترین نزدیک شود را معرفی می‌کند، سپس فناوری‌های اصلی که هر سطح را می‌سازند مرور می‌کند.

ادامه

تصورات غلط رایج درباره طراحی پردازنده و تصویر کلی فصل چهارم

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

ادامه

پایپ‌لاین‌های دنیای واقعی: مقایسه ARM و Intel، و تسریع ضرب ماتریس

مفاهیم نظری پایپ‌لاین در پردازنده‌های تجاری واقعی شکل مشخصی به خود می‌گیرند، که بسته به اهداف طراحی‌شان از نظر عمق پایپ‌لاین و عرض صدور به‌طور گسترده متفاوت‌اند. این مقاله مقایسه می‌کند ARM Cortex-A53 و Intel Core i7 چگونه پایپ‌لاینینگ را متفاوت برای کارایی توان در مقابل کارایی خام پیاده‌سازی می‌کنند، سپس نشان می‌دهد موازی‌سازی سطح دستور چگونه ضرب ماتریس را در عمل تسریع می‌کند.

ادامه

موازی‌سموازی‌سازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمانازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمان

موازی‌سازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمان

ادامه

یک پردازنده پایپ‌لاین‌شده چگونه استثناها را مدیریت می‌کند

هر دستوری آن‌طور که انتظار می‌رود اجرا نمی‌شود — برخی شرایط خطایی مانند یک opcode نامعتبر یا سرریز محاسباتی را فعال می‌کنند که پردازنده باید با امنیت به آن‌ها پاسخ دهد. این مقاله توضیح می‌دهد استثناها چه هستند، یک پردازنده پایپ‌لاین‌شده چگونه آن‌ها را بدون خراب کردن وضعیت برنامه تشخیص داده و مدیریت می‌کند، و چرا استثناها مشابه خطرهای کنترلی رفتار می‌شوند.

ادامه