فرمت اعداد رایانه‌ای

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

نمایش اعداد باینری 
رایانه‌ها داده‌ها را در مجموعه ای از ارقام باینری نشان می‌دهند. این نمایش شامل مجموعه ای از بیت‌ها است که به نوبه خود در مجموعه‌های بزرگتر مانند بایت‌ها (۸ بیت) گروه‌بندی می‌شوند.

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

یک بیت به تنهایی قادر است تنها دو مقدار را نشان دهد در حالیکه، رشته‌ای از بیت‌ها ممکن است برای نمایش مقادیر بزرگتر استفاده شود. به عنوان مثال، یک رشته از بیت‌ها به طول سه می‌تواند تا هشت (دو به توان سه) مقدار مجزا را همان‌طور که در جدول ۱ نشان داده شده‌است نشان دهد.

با افزایش تعداد بیت‌های تشکیل دهنده یک رشته، تعداد ترکیب‌های ممکن ۰ و ۱ به صورت تصاعدی افزایش می‌یابد. یک بیت تنها دو مقدار را می‌تواند نمایش دهد، دو بیت می‌تواند چهار مقدار مجزا را ایجاد کند، سه بیت هشت مقدار مجزا و …. که با فرمول 2^n افزایش می‌یابد. مقدار ترکیبات ممکن با اضافه شدن هر رقم باینری همان‌طور که در جدول ۲ نشان داده شده‌است، دو برابر می‌شود.

گروه‌بندی‌هایی با تعداد بیت‌های خاص برای نمایش چیزهای مختلف و دارای نام‌های خاص استفاده می‌شوند.

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

یک نیبل (گاهی اوقات nybble)، یک عدد است که که از چهار بیت تشکیل شده‌است. به عنوان یک نیم بایت، نیبل به عنوان بازی با کلمات نامگذاری می‌شود.

نمایش اعداد اکتال و هگزادسیمال 
رمزگذاری اکتال و هگزادسیمال راه‌های مناسبی برای نمایش اعداد باینری هستند، همان‌طور که توسط رایانه‌ها استفاده می‌شود. مهندسان کامپیوتر اغلب نیاز به نوشتن مقادیر باینری دارند، اما در عمل نوشتن یک عدد باینری مانند ۱۰۰۱۰۰۱۱۰۱۰۱۰۰۰۱ خسته کننده و مستعد خطا است؛ بنابراین، کمیت‌های باینری در قالب اعداد در مبنای هشت، یا "اکتال"، یا به‌طور معمول، پایه ۱۶، "هگزادسیمال" (هگز) نوشته می‌شوند. در سیستم دهدهی، ۱۰ رقم از ۰ تا ۹ وجود دارد که با هم ترکیب می‌شوند و اعداد را تشکیل می‌دهند. در یک سیستم هشتی فقط ۸ رقم از ۰ تا ۷ وجود دارد؛ یعنی مقدار اکتال "۱۰" همان عدد اعشاری "۸" است، یک اکتال "۲۰" یک اعشار "۱۶" و غیره. در یک سیستم هگزادسیمال، ۱۶ رقم وجود دارد، ۰ تا ۹، و طبق توافق ۶ رقم از A تا F. یعنی یک هگزادسیمال "۱۰" همان رقم اعشاری "۱۶" و یک هگزادسیمال "۲۰" یکسان است. مثال و مقایسه اعداد در پایه‌های مختلف در نمودار زیر توضیح داده شده‌است.

هنگام تایپ اعداد، از کاراکترهای خاصی برای توصیف سیستم اعداد استفاده می‌شود، به عنوان مثال 000_0000B یا 0b000_۰۰۰۰۰ برای اعداد باینری و 0F8H یا 0xf8 برای اعداد هگزادسیمال.

تبدیل بین پایه‌ها 

هر یک از این سیستم‌های اعداد یک سیستم موقعیتی هستند، اما در حالی که اوزان اعشاری توان‌های ۱۰ هستند، اوزان هشتی توان‌های ۸ و وزن‌های هگزا دسیمال توان‌های ۱۶ هستند. مقدار رقم را با مقدار موقعیت آن و سپس نتایج را اضافه می‌کند. به‌طور مثال:

نمایش کسرها به صورت دودویی

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

تعداد بیت‌های مورد نیاز برای دقت و محدوده مورد نظر باید برای ذخیره قسمت‌های کسری و صحیح یک عدد انتخاب شود. به عنوان مثال، با استفاده از فرمت ۳۲ بیتی، ۱۶ بیت برای عدد صحیح و ۱۶ بیت برای کسری ممکن است استفاده شود.

بیت هشتم به دنبال آن بیت چهارم، سپس بیت دوم و سپس بیت یکم می‌آید. بیت‌های کسری الگوی تعیین شده توسط بیت‌های عدد صحیح را ادامه می‌دهند. بیت بعدی بیت نیمه، سپس بیت چهارم، سپس بیت ⅛ و غیره است. به‌طور مثال:

این شکل از رمزگذاری نمی‌تواند برخی از مقادیر را به صورت باینری نشان دهد. به عنوان مثال، کسری 0.2 در اعشاری، نزدیک‌ترین تقریب می‌شود شرح زیر است:

حتی اگر ارقام بیشتری استفاده شود، نمایش دقیق غیرممکن است. شماره که به صورت اعشاری به صورت ۰٫۳۳۳۳۳۳۳۳۳... نوشته می‌شود، به‌طور نامحدود ادامه می‌یابد.

اعداد اعشاری 
در حالی که هر دو اعداد صحیح بدون علامت و علامت در سیستم‌های دیجیتال استفاده می‌شوند، حتی یک عدد صحیح ۳۲ بیتی برای مدیریت طیف وسیعی از اعدادی که یک ماشین حساب می‌تواند انجام دهد، کافی نیست، و این فقط شامل کسر نمی‌شود. برای تقریب محدوده و دقت بیشتر اعداد حقیقی، باید اعداد صحیح علامت دار و اعداد نقطه ثابت را کنار بگذاریم و به قالب " ممیز شناور " برویم.

در سیستم اعشاری، ما با اعداد ممیز شناور شکل (نماد علمی) آشنا هستیم:

 1.1030402 × 10 5 = 1.1030402 × ۱۰۰۰۰۰ = ۱۱۰۳۰۴٫۰۲

یا به‌طور خلاصه تر:

 1.1030402E5

که به معنی "۱٫۱۰۳۰۴۰۲ ضربدر ۱ به دنبال ۵ صفر است". ما یک مقدار عددی معین (۱٫۱۰۳۰۴۰۲) داریم که به عنوان " ضریب " شناخته می‌شود، ضرب در توان 10 (E5، به معنای 10 5 یا ۱۰۰۰۰۰)، که به عنوان " توان " شناخته می‌شود. اگر ما یک توان منفی داشته باشیم، به این معنی است که عدد در ۱ چند مکان در سمت راست نقطه اعشار ضرب می‌شود. مثلا:

 2.3434E − ۶ = 2.3434 × 10 -6 = 2.3434 × ۰٫۰۰۰۰۰۱ = ۰٫۰۰۰۰۰۲۳۴۳۴

مزیت این طرح این است که با استفاده از توان می‌توانیم دامنه بسیار وسیع‌تری از اعداد را بدست آوریم، حتی اگر تعداد ارقام در معنادار یا «دقت عددی» بسیار کوچک‌تر از محدوده باشد. فرمت‌های باینری ممیز شناور مشابهی را می‌توان برای رایانه‌ها تعریف کرد. تعدادی از این طرح‌ها وجود دارد که محبوب‌ترین آنها توسط موسسه مهندسین برق و الکترونیک (IEEE) تعریف شده‌است. مشخصات استاندارد IEEE 754-2008 فرمت ممیز شناور ۶۴ بیتی را با موارد زیر تعریف می‌کند:
 یک توان باینری ۱۱ بیتی، با استفاده از فرمت "excess-1023". Excess-1023 به این معنی است که توان به صورت یک عدد صحیح باینری بدون علامت از ۰ تا ۲۰۴۷ ظاهر می‌شود. با تفریق ۱۰۲۳ مقدار علامت دار واقعی به دست می‌آید
 یک معنادار ۵۲ بیتی، همچنین یک عدد باینری بدون علامت، که یک مقدار کسری را با یک پیشرو ضمنی "۱" تعریف می‌کند.
 یک بیت علامت، با دادن علامت عدد.

بیایید با دیدن اینکه یک عدد چگونه در ۸ بایت حافظه ذخیره می‌شود متوجه شویم این فرمت چگونه است.

که در آن "S" نشان دهنده بیت علامت، "x" نشان دهنده یک بیت توان و "m" نشان دهنده یک بیت معنادار است. هنگامی که بیت‌های اینجا استخراج شدند، با محاسبه زیر تبدیل می‌شوند:

 <sign> × (1 + <fractional significand>) × 2<exponent> − 1023

این طرح اعداد معتبر تا حدود ۱۵ رقم اعشاری را با دامنه اعداد زیر ارائه می‌دهد:

این مشخصات همچنین چندین مقدار خاص را تعریف می‌کند که اعداد تعریف‌شده نیستند و به عنوان NaNs شناخته می‌شوند، مخفف شدهٔ "ٔNot A Number". اینها توسط برنامه‌ها برای تعیین عملیات نامعتبر و موارد مشابه استفاده می‌شود.

برخی از برنامه‌ها از اعداد ممیز شناور ۳۲ بیتی نیز استفاده می‌کنند. متداول‌ترین طرح از یک معنادار ۲۳ بیتی با یک بیت علامت، به اضافه یک توان ۸ بیتی در قالب "excess-127" استفاده می‌کند که هفت رقم اعشاری معتبر را ارائه می‌دهد.

بیت‌ها با محاسبه زیر به یک مقدار عددی تبدیل می‌شوند:

 sign> × (1 + <fractional significand>) × 2<exponent> − 127>

منجر به محدوده اعداد زیر می‌شود:

چنین اعداد ممیز شناور به‌طور کلی به عنوان "واقعی" یا "شناور" شناخته می‌شوند، اما با تعدادی تغییرات:

مقدار شناور ۳۲ بیتی گاهی اوقات "real32" یا "single" نامیده می‌شود که به معنای "مقدار ممیز شناور با دقت یکتاً است.

یک شناور ۶۴ بیتی گاهی اوقات "real64" یا "double" نامیده می‌شود که به معنای "مقدار ممیز شناور با دقت دوگانه" است.

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

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

نمایش دقت محدودی دارد. به عنوان مثال، تنها ۱۵ رقم اعشاری را می‌توان با واقعی ۶۴ بیتی نشان داد. اگر یک عدد ممیز شناور بسیار کوچک به عدد بزرگ اضافه شود، نتیجه فقط عدد بزرگ است. عدد کوچک آنقدر کوچک بود که حتی با وضوح ۱۵ یا ۱۶ رقمی نشان داده نمی‌شد و کامپیوتر عملاً آن را کنار می‌گذارد. تجزیه و تحلیل اثر دقت محدود یک مسئله به خوبی مطالعه شده‌است. برآورد بزرگی خطاهای دور کردن و روش‌هایی برای محدود کردن تأثیر آنها بر محاسبات بزرگ، بخشی از هر پروژه محاسباتی بزرگ است. حد دقت با حد دامنه متفاوت است، زیرا بر ضریب علمی تأثیر می‌گذارد، نه توان.

ضریب علمی یک کسر باینری است که لزوماً با کسر اعشاری مطابقت ندارد. در بسیاری از موارد مجموع توانهای متقابل ۲ با کسر اعشاری خاصی مطابقت ندارد و نتایج محاسبات کمی کاهش می‌یابد. به عنوان مثال، کسر اعشاری "۰٫۱" معادل یک کسر باینری بی‌نهایت تکراری است: 0.000110011. . .

اعداد در زبان‌های برنامه‌نویسی 
برنامه‌نویسی به زبان اسمبلی به برنامه‌نویس نیاز دارد که نمایش اعداد را پیگیری کند. در مواردی که پردازنده از عملیات ریاضی مورد نیاز پشتیبانی نمی‌کند، برنامه‌نویس باید یک الگوریتم و دنباله دستورالعمل مناسب را برای اجرای عملیات ایجاد کند. در برخی از ریزپردازنده‌ها، حتی ضرب اعداد صحیح باید در نرم‌افزار انجام شود.

زبان‌های برنامه‌نویسی سطح بالا مانند Ruby و Python یک عدد انتزاعی را ارائه می‌دهند که ممکن است یک نوع توسعه‌یافته مانند rational , bignum یا complex باشد. عملیات ریاضی توسط روال‌های کتابخانه ای که توسط پیاده‌سازی زبان ارائه می‌شود انجام می‌شود. یک نماد ریاضی داده شده در کد منبع، با بارگذاری بیش از حد اپراتور، کد شی متفاوتی را که برای نمایش نوع عددی مناسب است فراخوانی می‌کند. عملیات ریاضی روی هر عددی - اعم از علامت دار، بدون علامت، گویا، ممیز شناور، نقطه ثابت، انتگرال یا مختلط - دقیقاً به همین ترتیب نوشته می‌شود.

برخی از زبان‌ها، مانند REXX و جاوا، عملیات ممیز شناور اعشاری را ارائه می‌کنند که خطاهای گرد کردن به شکل متفاوتی را ارائه می‌کنند.

جستارهای وابسته 
 محاسبات با دقت دلخواه
 اعشاری با کد دودویی
 سیستم اعداد باینری
 کد خاکستری
 سیستم اعداد

یادداشت‌ها و مراجع 
The initial version of this article was based on a public domain article from Greg Goebel's Vectorsite.

حساب رایانه‌ای
عددنویسی