ترجمه تخصصی مقالات انگلیسی

ترجمه تخصصی مقالات رشته های فنی مهندسی، علوم انسانی، علوم پایه، پزشکی، حقوق

ترجمه تخصصی مقالات انگلیسی

ترجمه تخصصی مقالات رشته های فنی مهندسی، علوم انسانی، علوم پایه، پزشکی، حقوق

در این وبلاگ، مطالب و مقالات علمی برای رشته های مختلف دانشگاهی، منتشر خواهد شد

ترجمه متون ریاضی انگلیسی به فارسی

چهارشنبه, ۱۰ اسفند ۱۴۰۱، ۰۲:۵۳ ب.ظ

ریاضی کامپیوتر

از بین انواع داده­ای که معمولا مواجه می­شویم، داده­هایی که معمولا در زمینه رایانش علمی می­بینیم از نوع عددی هستند: اعداد صحیح (یا عدد کامل)  . . . ., -2. -1, 0, 2, . . ., اعداد حقیقی 0, 1, -1.5, 2/3, 2 , log10, …، و اعداد مرکب 1 + 2i, 3-, 5i, …   . حافظه رایانه طوری سازماندهی شده است که فقط میزان معینی فضا برای هر عدد می­دهد، در حد چند بایت، هر یک حاوی 8 بیت. مقدار معمول برای تخصیص فضای حافظه 4 بایت برای عدد صحیح، 4 یا 8 بایت برای عدد حقیقی، و 8 یا 16 بایت برای عدد مرکب است.

 

 

سفارش ترجمه تخصصی برای همه رشته ها

 

چون برای ذخیره عدد میزان معینی حافظه وجود دارد، روشن است که همه اعداد از یک نوع معین را نمی­توان ذخیره کرد. برای مثال، برای اعداد صحیح فقط دامنه­ای از اعداد ذخیره می­شود. در مورد اعداد حقیقی ذخیره کردن طیفی از اعداد نیز امکان­پذیر نیست زیرا هر بازه [a, b] بینهایت عدد را شامل می­شود. بنابراین هر بازنمودی از اعداد حقیقی خلاءهایی را بین اعداد ذخیره شده موجب می­شود. گاهی محاسبات در کامپیوتر به صورت حساب با دقت محدود توصیف می­شود. چون بازنمود نتایج زیاد امکان­پذیر نیست هر محاسبه­ای که منجر به چنین عددی منجر می­شود به ناچار با انتشار خطا یا برآورد تقریبی نتیجه خواهد بود. در این فصل نگاهی داریم بر پیامدهای چنین بر آوردی از نتیجه واقعی  محاسبات عددی.

 

ترجمه ریاضی به فارسی

 

برای جزئیات بحث رجوع کنید به کتاب اورتون [132]؛ به راحتی می­توان نسخه آنلاین رساله گولدبرگ را نیز یافت [­68]. برای بحث گسترده درباره تحلیل خطای گرد کردن در الگوریتم­ها، رجوع کنید به هایم [68] و ویکنسون [164].

3.1. اعداد صحیح

در رایانش علمی بیشتر عملیات روی اعداد حقیقی است. محاسبات اعداد صحیح به ندرت بار محاسباتی جدی ایجاد می­کند. بیشتر برای کامل بودن توضیح این متن است که با بحث کوتاهی درباره اعداد صحیح شروع می­کنیم.

اعداد صحیح معمولا در 16، 32، یا 64 بیت ذخیره می­شوند و 16 کم کم از رواج می­افتد و 64 متداول­تر می­شود. با افزایش اندازه مجموعه­های داده (بویژه در محاسبات موازی)، ایندکس­های بزرگتری نیاز است. برای مثال، در 32 بیت می­توان اعداد صفر تا 232 – 1 ≈ 4.109 ذخیره کرد. به عبارت دیگر، ایندکس 32 بیت می­تواند 4 گیگابات حافظه را آدرس دهی کند. تا اخیراً این میزان برای بیشتر مقاصد کافی بود؛ این روزها نیاز به مجموعه­های بزرگ داده موجب شده است ایندکس 64 بیت ضروری باشد.

وقتی آرایه­ای را ایندکس­بندی می­کنیم، فقط اعداد صحیح مثبت لازم است. البته در محاسبات کلی عدد صحیح باید اعداد صحیح منفی را نیز شامل کنیم. حالا چند استراتژی برای پیاده کردن اعداد صحیح منفی بررسی می­کنیم. دراینجا انگیزه ما این است که حساب اعداد صحیح مثبت و منفی تا حد ممکن باید به اندازه حساب فقط اعداد مثبت ساده باشد: مداربندی که بر ای مقایسه و کار در رشته­های بیت داریم باید برای اعداد صحیح (دارای علامت) قابل استفاده باشد.

چندراه برای پیاده­سازی اعداد صحیح منفی وجود دارد. ساده­ترین راه حل ذخیره یک بیت به عنوان بیت علامت­دار، و استفاده از 31 بیت باقیمانده (یا 15 یا 63 بیت مانده؛ از حالا به بعد 32 بیت را استاندارد در نظر می­گیریم) برای ذخیره کردن اندازه مطلق است. تفسیری ساده­ای درباره رشته بیتی اعداد صحیح بدون علامت را بکار می­گیریم.

  این طرح معایبی دارد، یکی از این معایب این است که عدد صفر منفی و مثبت وجود دارد. این یعنی تست برابری بسیار پیچیده­تر از تست برابری به صورت رشته بیت است. مهم تر اینکه، در نیمه دوم رشته بیت­ها، تفسیر به عنوان عدد صحیح علامت­دار با رفتن به سمت راست کاهش می­یابد. این یعنی تست برای بیشتر از پیچیده می­شود؛ هم چنین افزودن عدد مثبت به عدد منفی باید متفاوت از افزودن آن به عدد مثبت در نظر گرفته شود.

راه حل دیگر این است که عدد n به عنوان n-B تفسیر شود که در آن B پایه­ای ممکن، مثل 231 است.   

 

این طرح تغییر یافته مشکل ±0 را ندارد، و اعداد ترتیب منسجم دارند. با این حال، اگر n-n را با عمل روش رشته­ای محاسبه کنیم که n را نشان می­دهد، رشته بیت برای صفر را بدست نمی­آوریم. برای بدست آوردن آن، خط عدد را برمی­گردانیم تا الگوی صفر را در صفر برگردانیم.

طرح حاصل که  به صورت متداول نیز بکار می­رود، مکمل 2 نامیده می­شود. با استفاده از این طرح، الزام اعداد صحیح به شکل زیر تعریف می­شود.

  • اگر 0 m 231 – 1 باشد، الگوری بیت نرمال برای m بکار می­رود.
  • برای -231 n -1، n با الگوی بیت برای 232 - |n| نمایش داده می­شود.

نمودار زیر مطابقت رشته بیت­ها و تفسیر آنها به عنوان عدد صحیح مکمل 2 را نشان می­دهد:

 

 

سایت سفارش ترجمه

 

برخی مشاهدات عبارتند از:

  • انطباق بر روی هم بین الگوهای بیت برای اعداد صحیح مثبت و منفی وجود ندارد، بویژه فقط یک الگو برای صفر وجود دارد.
  • اعداد مثبت بیت نهایی صفر دارند، اعداد منفی بیت نهایی معین دارند.

تمرین 3.1. برای طرح «خام» و طرح مکمل 2 برای اعداد منفی، شبه کد برای تست مقایسه m < n را بدهید، که m و n عدد صحیح هستند. دقت کنید بین همه موارد مثبت، صفر یا منفی m,n تمایز قائل شوید.

افزودن دو عدد با علامت یکسان، یا ضرب دو عدد با هر علامتی، ممکن است منجر به نتیجه­ای شود که خیلی بزرگ یا خیلی کوچک باشد. این سرریز نامیده می­شود.

سفارش ترجمه تخصصی برای همه رشته ها

تمرین 3.2. بررسی کنید که وقتی چنین محاسبه­ای را انجام می­دهید، چه اتفاقی می­افتد. اگر سعی کنید عدد غیرقابل بازنمود را مثلا در حکم گمارشی بنویسید، کمپایلر چه می­گوید؟

در تمرین 3.1. بالا مقایسه دو عدد صحیح را بررسی کردید. حالا اجرای کسر اعداد در مکمل دو را بررسی می­کنیم. 0 m 231-1 و 1 n 231 را در نظر بگیرید ببینید در محاسبه m-n چه اتفاقی می­افتد.

فرض کنیم الگوریتمی برای افزودن یا کسر 32 بیت عدد صحیح بدون علامت داریم. آیا می­توانیم از آن برای کسر اعداد  صحیح مکمل دو استفاده کنیم؟ با این مشاهده شروع می­کنیم که کسر عدد صحیح m – n به جمع بدون علامت m + (232 – n) تبدیل می­شود.

  • مورد: m < n، در این مورد m – n منفی است و 1 |m - n| 231، بنابراین الگوی بیت برای m-n الگوری 232 – (n – m) ا ست. حالا 232 – (n – m) = m + (232 – n)، بنابراین می­توان m – n را در مکمل 2  با افزودن الگوهای بیت m و –n به عنوان عدد صحیح بدون علامت محاسبه کرد.
  • مورد: m > n. در اینجا مشاهده می­کنیم که m + (232 – n) = 232 + m – n > 0، این عدد>232  است و در نتیجه بازنمود درستی از عدد منفی نیست. با این حال، اگر این عدد را در 33 بیت ذخیره کنیم، می بینیم که نتیجه درست  m-n است، به اضافه یک بیت در جای 33rd . بنابراین با انجام جمع بدون علامت، با صرفنظر از بیت سرریز، نتیجه درست را بدست می آوریم.

در هر دو مورد نتیجه می گیریم که می توان تفریق m-n را با افزودن عدد بدون علامتی که m و –n را نشان می­دهد و با صرفنظر  از سرریز در صورت وقوع، انجام داد.

3.2. اعداد حقیقی

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

3.2.1. اعداد حقیقی واقعا اعداد حقیقی نیستند

در علوم ریاضی همیشه با اعداد حقیقی سر و کار داریم، بنابراین به راحتی می­توان وانمود کرد که کامپیوتر هم می­تواند اینکار را انجام دهد. با این حال، چون اعداد در کامپیوتر فقط تعداد متناهی بیت دارند، بیشتر اعداد حقیقی را نمی­توان دقیقا نشان داد. در واقع، حتی بسیاری از کسرها را نمی­توان دقیق نشان داد زیرا تکرار می­شوند؛ برای مثال، 1/3 = 0.333. …. این مورد در ضمیمه 37.7 نشان داده شده است.

تمرین 3.3. برخی زبان­های برنامه نویسی به شما امکان می­دهند علاوه بر اعداد صح یح با اعداد حقیقی نیز به عنوان «شمارنده» بنویسید. توضیح دهید که چرا اینکار خوب نیست. راهنمایی: چه موقع به مرز بالا می­رسید؟

اینکه کسر تکرار می­شود یا نه به سیستم عدد وابسته است. (چگونه 3/1 را در سه ت ایی می­نویسید، پایه 3 حسابی است؟( در کامیپوترهای باینری این یعنی کسرهایی مثل 1/10، که در حساب اعشاری دارای پایان هستند، تکرار شونده هستند. از آنجا که حساب اعشاری در محاسبات مالی مهم است، برخی افراد مراقب این نوع حق حساب هستند؛ رجوع کنید به بخش 3.2.2.2 برای آنچه که در اینباره صورت گرفته است.

3.2.2. بازنمود اعداد حقیقی

اعداد حقیقی با استفاده از طرحی ذخیره می­شوند که شبیه به چیزی است که «نشانه­گذاری علمی» نامیده می­شود، و در آن عدد به صورت نماد و توان نمایش داده می­شود، مثل 6.022.1023، که نماد 6022 و نقطه مبنا بعد از رقم اول، و توان 23 است. این عداد یعنی

   

پایه ( مبنا)، عدد  صحیح کوچک، 10 در مثال قبلی، و 2 در اعداد کامپیوتر را اضافه می­کنیم، و اعداد را بر حسب آن به صورت عبارت مجموع t می­نویسیم.

 

که مولفه­های آن عبارتند از

  • بیت علامت: یک بیت که مثبت و منفی بودن عدد را ذخیره می­کند؛
  • β پایه سیستم عدد است؛
  • 0 di β – 1 ارقام مانتیس (جز اعشاری) یا مبنا هستند محل نقطه نقطه مبنا (ممیز) به طور ضمنی بلافاصله بعد از رقم اول فرض شده است؛
  • t طول مانتیس است؛
  • توان e ϵ [L, U]؛ معمولا L < 0 < U و L -U.

توجه  داشته باشید که بیت علامت  روشنی برای کل عدد وجود دارد؛ علامت توان متفاوت در نظر گرفته می­شود. به د لایل کارآیی، e عدد علامت­دار نیست؛ بلکه به صورت عدد بدون علامت مازاد بر مقدار حداقل معین در نظر گرفته شده است. برای مثال، الگوی بیت برای عدد صفر به صورت e = L تفسیر  می شود.

3.2.2.1. چند مثال

چند مثال خاص برای بازنمود با ممیز شناور بررسی می­کنیم. پایه 10 منطقی­ترین گزینه برای محاسبه انسانی است، ما کامپیوترها باینری هستند، بنابراین مبنای 2 بکار می­رود. کامپیوترهای قدیمی (بزرگ) IBM بیت­ها را دسته­بندی می­کرد تا بازنمود مبنای 16 را بدهد.

 

از بین اینها، فرمت تک دقتی (دقت معمولی) و دقت مضائف تاکنون متداول­ترین فرمت­ها هستند. اینها را در بخش 3.2.7  بحث می­کنیم.

3.2.2.2. عدد اعشاری با کدگذاری باینری

اعداد اعشاری از نظر محاسبه علمی مهم نیستند، اما در محاسبات مالی مفید هستند، که محاسبات پول را  دربرمی­گیرد و باید دقیق باشد. حساب باینری در اینجا نقطه ضعف دارد زیرا اعدادی مثل 10/1 کسرها تکراری در باینری هستند. با تعداد متناهی بیت در مانتیس، این یعنی عدد 10/1 را نمی­توان به صورت باینری دقیق نشان داد. به همین دلیل طرح­های اعشاری کدگذاری باینری در کامپیوترهای قدیمی IBM بکار رفته است و در واقع در ورژن IEEE754 استاندارد می­شوند [90]؛ رجوع کنید به بخش 3.2.7.

 

سایت ترجمه مقاله انگلیسی به فارسی رایگان

 

در طرح­های BCD یک یا چند رقم اعشار در تعدادی بیت کدگذاری می­شود. ساده ترین طرح ارقام 9. . . 0  را در چهار بیت کدگذاری می کند. اینکار  این مزیت را داردکه در عدد BCD هر رقم به راحتی شناسایی می­شود؛ عیب این طرح هم این است که حدود 3/1 همه بیت­ها هدر می­رود، زیرا 4 بیت می­تواند اعداد 15. . . 0 را کدگذاری کند. کدگذاری­های موثرتر اعداد 999 . . . 0 را در ده بیت کدگذاری می­کنند که در اصل می­توانند 1023 . . . 0 را ذخیره کنند. با اینکه این طرح از این نظر موثر است که بیت کمتری هدر می­رود، اما شناسایی ارقام به صورت تک تک در چنین عددی نیاز به رمزگشایی دارد. به همین دلیل حساب BCD نیاز به پشتیبانی سخت­افزاری پردازشگر دارد که به ندرت این روزها یافت می­شود؛ مثالی از این دست ساختار IBM Power است که با IBM Power6 شروع می­شود.

3.2.2.3. مبناهای عددی دیگر برای حساب کامپیوتر

3.2.3. محدودیت­ها

از آنجا که ما فقط از تعداد متناهی بیت برای ذخیره کردن اعداد با ممیز شناور استفاده می­کنیم، همه اعداد را نمی­توان نشان داد. اعدادی که نمی­توان نشان داد به دو گروه تقسیم می­شوند: آنهایی که خیلی بزرگ یا خیلی کوچک هستند (از جهاتی)، و آنهایی کهدر خلاءها (جاهای خالی) قرار می­گیرند. اعداد ممکن است به طرق زیر خیلی بزرگ یا خیلی کوچک باشند.

سرریز شدن: بزرگترین عددی که می­توان ذخیره کرد عبارت است از

و کوچک ترین عدد (در مفهوم مطلق) عبارت است از – (ββ-(t – 1)؛ هر عددی بزرگتر از عدد بالا یا کوچک­تر از عدد دوم وضعیتی را بوجود می­آورد که سرریز (overflow) نامیده می­شود.

پاریز: نزدیکترین عدد به صفر β(t – 1) . βL است. محاسبه­ای که نتیجه کمتر از این عدد داشته باشد (برحسب مقدار مطلق) منجر به وضعیت پاریز (underflow) می­شود. (برای پاریز تدریجی، رجوع کنید به 3.2.4).

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

3.2.4. اعداد به هنجار شده و به هنجار نشده

تعریف کلی از اعداد با ممیز شناور، معادله (3.1)، ما را با این مسئله مواجه می­سازد که اعداد بیش از یک بازنمود دارند. برای مثال، 5 × 102 = 0.5 × 102. چون این امر موجب می­شود حساب کامپیوتری بی­جهت پیچیده شود، مثلاً در تست برابری اعداد، از اعداد با ممیز شناوری به هنجار شده استفاده می­کنیم. عدد در صورتی به هنجار شده است که رقم اول آن مخالف صفر باشد. یعنی قسمت مانتیس β > xm 1 باشد.

 

سفارش ترجمه تخصصی برای همه رشته ها

دلالت عملی در مورد اعداد باینری این است که رقم اول همیشه 1 باشد، بنابراین نیازی نیست که آن را به طور صریح ذخیره کنیم. در استاندارد IEEE 754، این یعنی هر عدد با ممیز شناور به این شکل است

 

و فقط رقم d1d2 . . . dt ذخیره می­شود.

دلالت دیگر این طرح این است که باید تعریف پاریز را اصلاح کنیم (رجوع کنید به بخش 3.2.3 در بالا): به جای اینکه کوچکترین عدد – (ββ(t – 1)، هر عدد کمتر از 1 . βL موجب پاریز می­شود. در محاسبه محاسبه عددی کمتر از مقدار مطلق گاهی با استفاده از اعداد با ممیز شناور هنجار نشده انجام می­گیرد، که این فرآیند پاریز تدریجی نامیده می­شود. در این مورد، مقدار ویژه توان نشان می­دهد که عدد دیگر به هنجار نیست. در مورد حساب استاندارد IEEE (بخش 3.2.7) اینکار از طریق فیلد توان صفر انجام می­گیرد.

با این حال، معمولاً اینکار ده تا صدها برابر آهسته­تر از محاسبه با اعداد با ممیز شناور معمولی است. هنگام نوشتن، فقط IBM Power6 پشتیبان سخت­افزاری برای پاریز تدریجی دارد.

3.2.5. خطای بازنمود

عدد حقیقی را در نظر بگیرید که در سیستم عدد کامپیوتر قابل بازنمود نیست.

عدد غیرقابل بازنمود با گرد کردن یا با کوتاه کردن محاسبه می­شود. این یعنی عدد ماشینی بازنمود برای هر x در بازه حول آن است. با t رقم در مانتیس، این بازه اعدادی است که در رقم t + 1st  فرق می­کند. برای قسمت مانتیس داریم:

 

اگر x یک عدد باشد و x̃ بازنمود آن در کامپیوتر باشد، x – x̃ را خطای بازنمود یا خطای مطلق بازنمود می­نامیم، و x – x̃ /x خطای بازنمود نسبی است. غالبا علامت خطا برایمان مهم نیست، بنابراین می­توان عبارت خطا و خطای نسبی را به ترتیب برای |x - x̃| و |x – x̃ / x| بکار برد.

غالبا   مرز خطا بر ایمان مهم است. اگر ϵ مرز  خطا باشد، داریم

 

برای خطای نسبی می­توان دید که

 

حالا مثالی را در حساب اعشاری در نظر می­گیریم؛ یعنی، β = 10، و با مانتیسرقم 3: t = 3. عدد x = 1.265 بازنمودی دارد که به گردکردن یا کوتاه­سازی وابسته است: x̃round = 1.26، x̃truncate = 1.25. خطا در رقم چهارم است: اگر ϵ = x – x̃ باشد در اینصورت |ϵ| < βt-1 است.

تمرین 3.4. عدد در این مثال قسمت دارای توان ندارد. اگر چنین قسمتی وجود داشت خطا و خطای نسبی چه بود؟

3.2.6. دقت ماشین

غالبا ما فقط به اندازه  خطای بازنمود توجه داریم، و می­نویسیم x̃ = x(1 + ϵ)، که در آن |ϵ| β-t. این خطای نسبی حداکثر دقت ماشین یا گاهی اپسیلون ماشین نامیده می­شود. مقادیر معمول عبارتند از:

 

دقت ماشین را می­توان به گونه دیگری تعریف کرد: ϵ کوچکترین عددی است که می­توان به 1 افزود تا 1 + ϵ بازنمودی متفاوت از 1 داشته باشد. مثالی کوچک نشان می­دهد که تنظیم توان­ها چگونه می­تواند اپراند (عملوند) خیلی کوچک را طوری تغییر دهد که در عمل جمع به طور موثر از آن صرفنظر شود:

 

اما راه دیگر این است که مشاهده کنیم در جمع x + y، اگر نسبت x به y خیلی بزرگ باشد، نتیجه کاملا برابر با x خواهد بود.

دقت ماشین حداکثر دقت ممکن در محاسبات است: در تک دقتی درخواست درستی بیش از 6 رقم و در دقت مضائف درخواست درستی بیش از 15 رقم بی معنی است.

تمرین 3.5. برنامه کوچکی بنویسید که اپسیلون ماشین را محاسبه می­کند. آیا اگر سطح بهینه­سازی کمپایلر را خیلی پایین یا بالا بگیریم تفاوتی ایجاد می­شود؟

تمرین 3.6. عدد e 2.72، مبنای لگاریتم طبیعی، تعارف متفاوتی دارد. یکی از آنها عبارت است از

برنامه تک دقتی بنویسید که سعی می­کند e را به این شیوه محاسبه کند. عبارت برای n = 10k را با k = 1, …,10 ارزیابی کنید. خروجی را برای n بزرگ توضیح دهید. درباره رفتار خطا توضیح دهید.

3.2.7. استاندارد IEEE 754 برای اعداد با ممیز شناور

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

این استاندارد هم چنین گفت که رفتار گرد کردن درست است: نتیجه عمل باید نسخه گرد شده نتیجه دقیق باشد. در ادامه توضیح بیشتری درباره ت اثیر گرد کردن (و کوتاه سازی) بر محاسبات عددی آمده است.

 

شکل 3.1. حساب تک دقتی

در بالا (بخش 3.3.3) پدیده سرریز و پاریز را دیدیم، یعنی عملیاتی که منجر به اعداد غیرقابل بازنمود می­شود. وضعیت استثنایی دیگری هم وجود دارد که باید بررسی شود: اگر برنامه عملیات غیرمجاز مثل -4  را درخواست کند، نتیجه چه خواهد بود؟ استاندارد IEEE 754 دو کمیت خاص برای این وضعیت دارد: INf و NaN برای ‘infinity’ (بی نهایت) و ‘not a number’ (عدد نیست). بینهایت نتیجه سرریز یا تقسیم بر صفر است، عدد نیست (not a number) نتیجه، مثلاً، کسر بی نهایت از بی نهایت است. اگر NaN در عبارتی باشد، کل عبارت برای آن مقدار ارزیابی خواهد شد. قاعده محاسبه با Inf کمی پیچیده­تر است [68].

فهرستی از معنی همه الگوهای بیت در دقت مضائف IEEE 754 در شکل 3.1 آمده است. از بخش 3.2.4 در بالا به خاطر آورید که برای اعداد به هنجار شده اولین رقم مخالف صفر 1 است، که ذخیره نمی شود، بنابراین الگوری بیت d1, d2, . . ., dt به صورت 1.d1, d2, …, dt تفسیر می شود.

تمرین 3.7. هر برنامه نویس، در نقطه­ای از زندگی خود، به اشتباه عدد حقیقی را به صورت عدد صحیح یا به  گونه دیگر ذخیره می­کند. مثلا ممکن است اگر تابعی را متفاوت از آنچه که تعریف شده است، فرمان  دهید، این وضعیت روی دهد.

 

  

وقتی x را در تابع پرینت می­کنید چه روی می دهد؟ الگوی بیت برای عدد صحیح کوچک را در نظر بگیرید، و از جدول شکل 3.1 برای تفسیر عدد با ممیز شناوری استفاده کنید. توضیح دهید این عدد به هنجار نشده خواهد بود.

امروزه تقریبا همه پردازشگرها استاندارد IEEE 754 را دنبال می کنند. نسل­های قبلی GPUهای NVidia Tesla از نظر تک دقتی مطابق با استاندارد نبودند. توجیه این بود که تک دقتی بیشتر برای گرافیک بکار می­رود که مطابقت دقیق چندان مهم نیست. برای بسیاری از محاسبات علمی، دقت مضائف ضروری است، زیرا دقت محاسبات با افزایش اندازه مسئله یا زمان اجرا بدتر می شود. این امر در مورد محاسبات فصل 4 نیز صدق می کند، اما برای بقیه مثل متد شبکه بولتزمن (Lattice Boltzman Method, LBM) صدق نمی کند.

3.3. تجزیه و تحلیل خطای گرد کردن

اعدادی که خیلی بزرگ یا خیلی کوچک هستند و قابل بازنمود نیستند و منجر به سرریز یا پاریز می­شوند، متداول نیستند: معمولا می توان محاسبات را طوری ترتیب داد که این وضعیت روی ندهد. برعکس، موردی که نتیجه محاسبه بین اعداد کامپیوتر (حتی چیزی به سادگی یک جمع) قابل بازنمود نباشد، خیلی متداول است. بنابراین با نگاهی به اجرای الگوریتم، باید تاثیر خطاها کوچک در محاسبه را تجزیه و تحلیل کنیم. اینکار معمولا تجزیه و تحلیل خطای گرد کردن نامیده می شود.

3.3.1. گرد کردن درست

استاندارد IEEE 754 که در بخش 3.2.7 عنوان شد، علاوه بر اینکه روش ذخیره اعداد با ممیز شناور را عنوان می­کند، استانداردی نیز برای درستی عملیات مثل جمع، تفریق، ضرب و تقسیم می دهد. مدل حساب در استاندارد گرد کردن درست است: نتیجه عمل باید به گونه­ای باشد که با  فرآیند زیر مطابقت داشته باشد:

  • نتیجه دقیق عملیات محاسبه شده باشد، چه قابل بازنمود باشد یا نباشد؛
  • سپس این نتیجه تا نزدیکترین عدد کامیپوتر گرد شود.

خلاصه: بازنمود نتیجه عملیات  نتیجه دقیق گردشده­ آن عمل است. (البته بعد از عملیات دیگر نیازی نیست نتیجه محاسبه شده نسخه دقیق گرد شده نتیجه دقیق باشد.)

اگر این گفته کم اهمیت یا بدیهی به نظر می رسد، تفریق را به عنوان مثال در نظر بگیرید. در سیستم عدد اعشاری با دو رقم در مانتیس، محاسبه 1.0 – 9.4 . 10-1 = 1.0 – 0.94 = 0.06 = 0.06 . 10-2 است. توجه داشته باشید که در مرحله وسط 0.94 پدید می­آید، که یک رقم بیشتر از دو عددی دارد که ما برای سیستم عددی خودی بیان کردیم. رقم اضافه رقم گارد (نگهبان) نامیده می شود.

بدون رقم گارد، این عملیات به صورت 1.0 – 9.4 . 10-1 پیش می­رود که در آن 9.4 . 10-1 به 0.9 گرد می­شود و نتیجه نهایی 0.1 بدست می­آید که تقریبا دو برابر نتیجه درست است.

 

ترجمه انگلیسی به فارسی آنلاین

 

تمرین 3.8. محاسبه 1.0 – 9.5 . 10-1 را در نظر بگیرید و بازهم فرض کنید اعداد گرد شده­اند تا با مانتیس رقم 2 متناسب باشند. چرای محاسبه بدتر از مثال است؟

یکی رقم نگهبان برای تضمین گرد کردن درست کافی نیست. تجزیه و تحلیلی که در اینجا نیامده است، نشان می­دهد که سه بیت اضافه لازم است [67].

3.3.1.1. عملیات Mul-Add

در سال 2008 استاندارد IEEE 754 بازنگری شد تا رفتار عملیات Fused Multiply-Add (FMA) (جمع و ضرب آمیخته) شامل شود، یعنی عملیات به شکل a * b + c. استاندارد در اینجا گردکردن درست را نتیجه این محاسبه ترکیبی تعریف می­کند که باید نتیجه گرد شده درست باشد. اجرای خام این عملیات دو گرد کردن را دربرمی­گیرد: یکی بعد از ضرب و دیگری بعد از جمع.

تمرین 3.9. آیا می­توانید مثالی عنوان کنید که گرد کردن درست FMA در حد قابل توجهی دقیق­تر از گرد کردن ضرب و جمع به صورت جداگانه باشد؟ راهنمایی: عبارت c  را با علامت مخالف به صورت a * b بگیرید، و سعی کنید حذف در تفریق را اعمال کنید.

گاهی عملیات Mul-add (ضرب و جمع) از فرمت دقت گسترده 80 بیت برای دقت بیشتر نتیجه میانی  استفاده می­کند.

3.3.2. جمع

جمع دو عدد با ممیز شناور در چند مرحله انجام می­گیرد. اولاً توان­ها همتراز هستند: عدد کوچکتر بین دو عدد طوری نوشته می­شود که توان برابر با عدد بزرگ داشته باشد. سپس مانتیس افزوده می­شود. در نهایت، نتیجه طوری تنظیم می­شود که بازهم عدد به هنجار شده باشد.

برای مثال، 1.00 + 2.00 × 10-2 را در نظر بگیرید. با تراز کردن (تنظیم) توان­ها، به این شکل خواهد بود: 1.00 + 0.02 = 1.02 و این نتیجه به تنظیم نهایی نیاز ندارد. متوجه شدیم که این محاسبه دقیق است اما جمع 1.00 + 2.55 × 10 -2 همان نتیجه را دارد، و در اینجا روشن است که محاسبه دقیق نیست: نتیجه دقیق 1.0255 است که با سه رقم برای مانتیس (سه رقم اعشار) قابل بازنمود نیست.

 

سفارش ترجمه تخصصی برای همه رشته ها

در مثال 6.15 × 101 + 3.98 × 101 = 10.13 × 102 1.01 × 102 می­تواندید که بعد از اضافه شدن مانتیس­ها تنظیم توان لازم است. بازهم خطا ناشی از کوتاه­سازی یا گرد کردن رقم اول نتیجه است که در مانتیس متناسب نیست: اگر x جمع واقعی باشد و x̃ جمع محاسبه شده باشد، در اینصورت x̃ = x(1 + ϵ) است که با مانتیس رقم 3، |ϵ| < 10-3 است.

محاسبه s = x1 + x2 را در نظر بگیرید، و فرض می­کنیم که اعداد xi به صورت x̃ = xi(1 + ϵi) بازنمود می­شود. بنابراین مجموع s به صورت زیر بازنمود می­شود

 

با این فرض که همه ϵi کوچک است و تقریبا با اندازه برابر است، و هر دو xi > 0 است. می توان دید که خطاهای نسبی با جمع زدن اضافه می شود.

3.3.3. ضرب

ضرب ممیز شناور، همانند جمع، چند مرحله را در برمی­گیرد. بر ای ضرب دو عدد m1 × βe1 و m2 × βe2، مراحل زیر لازم است.

  • توان­ها جمع می­شود: e e1 + e2.
  • مانتیس­ها ضرب می­شود: m m1 × m2.
  • مانتیس به هنجار شده، و توان براساس آن تنظیم می­شود.

برای مثال: 1.23 . 100 × 5.67 . 101 = 0.69741 . 101 6.9741 . 100 6.97 . 100.

تمرین 3.10. خطای نسبی ضرب را تجزیه و تحلیل کنید.

3.3.4. تفریق    

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

برای مثال، تفریق با 3 رقم اعشار را در نظر بگیرید: 1.24 – 1.23 = .001 1.00.10-2. با اینکه نتیجه دقیق است، فقط یک رقم معنی دار دارد. برای مشاهده آن، موردی را در نظر بگیرید که 1.24 اول در واقع نتیجه گرد شده محاسبه است که باید منجر به 1.235 شده باشد.  در این مورد نتیجه تفریق باید 5.00 . 10-3 بوده باشد، یعنی خطای 100% وجود دارد، ولو اینکه خطای نسبی کوچکتر از حد انتظار باشد. روشن است که عملیات بعدی نیز که نتیجه این تفریق را دربرمی­گیرد دقیق نخواهد بود. نتیجه می گیریم که تفریق اعداد تقریبا برابر علت احتمالی گرد کردن عددی است.

برخی ریزه­کاری­ها در مورد این مثال وجود دارد. تفریق اعداد برابر تقریباً دقیق است، و ما رفتار گرد کردن درست حساب IEEE را داریم. اما درستی یک عمل واحد دلالت بر این نیست که چند عمل متوالی حاوی آن درست باشد. با اینکه مثال جمع کاهش ناچیز دقت عددی را نشان داد، حذف آن در این مثال می­تواند تاثیرات فاجعه­باری داشته باشد.

3.3.5 مثال­ها

با توجه به توضیحات بالا، ممکن است خواننده این برداشت را داشته باشد که خطاهای گردکردن فقط در شرایط استثنایی منجر به مسائل جدی می­شود. در این بخش چند مثال را بررسی می­کنیم که در آنها غیردقیق بودن حساب کامپیوتری در نتیجه محاسبه قابل مشاهده است. این مثال­ها ساده هستند؛ مثال­های پیچیده­تری هستند که خارج از حوزه این کتاب می­باشد، مثل بی­ثباتی معکوس ماتریس. برای تو ضیحات بیشتر می­توانید رجوع کنید به [164، 86].

3.3.5.1. فرمول abc

 به عنوان مثال عملی، معادله کوادراتیک ax2 + bx + c = 0 را در نظر بگیرید که حل آن عبارت است از x=-b±b2-4ac2a . فرض کنید b > 0 و b2 >> 4ac است در اینصورت b2+4ac≈b  و جواب ‘+’ نادرست خواهد بود. در این مورد بهتر است x_=-b±b2-4ac2a  محاسبه شود و x + .x­_ = -c / a بکار رود.

تمرین 3.11. برنامه­ای بنویسیدکه ریشه معادله کوادراتیک را محاسبه کند، هم  به شیوه "کتاب" و هم به ر وشی که در بالات توضیح داده شد.

  • b = 1 و a = -c بگیرید، و 4ac 0 با مقادیر پیش­رونده کوچکتر برای a و c.
  • ریشه محاسبه شده، ریشه با استفاده محاسبه باثبات، و مقدار f(x) = ax2 + bx + c را در ریشه محاسبه شده نسخه چاپی بگیرید.

حالا فرض کنید توجه زیادی به مقدار واقعی ریشه ندارید: می­خواهید مطمئن شوید که باقیمانده f(x) در ریشه محاسبه شده کوچک است. x* را ریشه  دقیق بگیرید، در اینصورت

 

حالا به صورت جداگانه موارد a 0، c = -1 و a  = -1، c 0 را بررسی کنید. آیا می­توانید تفاوت را توضیح دهید؟

3.3.5.2. جمع زدن سری

مثال قبل درباره پیش­گیری از خطای بزرگ گرد کردن در یک عملیات بود. این مثال نشان می­دهد که حتی ساختار تدریجی خطای گرد کردن را می­توان به روش­های مختلفی کنترل کرد.

جمع= 1.644834  n=110001n2  را در نظر بگیرید و فرض کنید با تک دقتی کار می کنیم، که در بیشتر کامپیوترها یعنی دقت ماشین 10-7. مسئله مربوط به این مثال این است که هم نسبت بین عبارت­ها و هم نسبت عبارت­ها به مجموع نسبی همواره رو به افزایش است. در بخش 3.2.6 مشاهده کردیم که ممکن است نسبت خیلی بزرگ منجر به افزایش یک اپراند جمع شود و در نتیجه نادیده گرفته شود.

 اگر سری­ها را به ترتیبی که داده شده است، جمع بزنیم، مشاهده می­کنیم که جمله اول 1 است، بنابراین همه مجموع­های نسبی (Nn=1که در آن N < 10000) حداقل 1 است. این یعنی هر جمله­ای که در آن 1/n2 <10-7 باشد نادیده گرفته می­شود زیرا کمتر از دقت ماشین است. بویژه 7000 جمله آخر صرفنظر می­شود و مجموع محاسبه شده 1.644725 است. 4 رقم اول درست است.

با این حال، اگر مجموع را به ترتیب عکس ارزیابی کنیم نتیجه دقیق را در تک دقتی بدست می­آوریم. هنوز مقادیر کوچک را به مقادیر بزرگ اضافه می­کنیم، اما حالا دیگر نسبت به اندازه یک به ϵ بد نیست، بنابراین هرگز از عدد کوچک صرفنظر نمی­شود. برای مشاهده این، نسبت دو جمله متوالی را در نظر بگیرید:

 

از آنجا که فقط 105 جمله را جمع می­زنیم و دقت ماشین 10-7 است، در جمع 1/ n2 + 1/ (n – 1)2 جمله دوم به طور کامل صرفنظر نخواهد شد زیرا زمانی است که از بزرگ به کوچک جمع می­زنیم.

تمرین 3.12. هنوز در توجیه ما یک مرحله شامل نشده است. نشان دادیم که در جمع زدن دو جمله متوالی، از جمله (عبارت) کوچکتر صرفنظر می­شود. با این حال، هنگام محاسبه مجموع نسبی را به جمله بعدی به صورت متوالی اضافه می­کنیم. نشان دهید که اینکار وضعیت را بدتر نمی­کند.

درسی که در اینجا می­توان گرفت این است که سری­ها تکرار یکنواخت (یا تقریبا یکنواخت) هستند که باید از کوچک به بزرگ جمع شوند، زیرا خطا در صورتی به حداقل می­رسد که اندازه مقادیری که جمع زده می­شود نزدیک به هم باشد. توجه داشته باشید که این استراتژی عکس استراتژی تفریق است، که عملیاتی که مقادیر مشابه را دربرمی­گیرد منجر به خطای بزرگتر می­شود. یعنی اگر اپلیکیشنی درخواست جمع و تفریق سری اعداد را داشته باشد، و ما از قبل بدانیم کدام جملات مثبت و کدامیک منفی هستند، ممکن است نتیجه، بازآرایی الگوریتم براین اساس باشد.

3.3.5.3. الگوریتم­های بی­ثبات

حالا مثالی را در نظر می­گیریم تا مستقیماً این بحث را مطرح کنیم که الگوریتم نمی­تواند از عهده مسائل ناشی از بازنمود نادرست اعداد حقیقی برآید.

رکورانس yx=01xnx-5dx1n-5yn-1  را در نظر بگیرید. به راحتی می­توان دید که به صورت یکنواخت در حال کاهش است؛ عبارت اول را می­توان به صورت y0 = ln6- ln5 محاسبه کرد.

با انجام محاسبه تا 3 رقم اعشار داریم:

 

سفارش ترجمه تخصصی برای همه رشته ها

 

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

اگر خطای ϵn را در n مرحله تعریف کنیم

 

در اینصورت داریم

 

بنابراین ϵn ≥ 5ϵn-1. خطایی که با این محاسبه روی می­دهد رشد تصاعدی دارد.

3.3.5.4. حل سیستم خطی

گاهی می­توان چیزهایی درباره دقت عددی مسئله گفت، حتی بدون اینکه الگوریتم مورد استفاده مشخص باشد. فرض کنید می­خواهیم سیستم خطی را حل کنیم، یعنی ماتریس A به شکل n × m و بردار b در اندازه n داریم و می­خواهیم بردار x را طوری محاسبه کنیم که Ax = b باشد. (در واقع الگوریتم­ها را برای این منظور در فصل 5 بررسی می­کنیم.) چون بردار b  نتیجه محاسبه یا اندازه­گیری است، با بردار b̃ سروکار داریم، که انحرافی از b ایده­آل است:

 

بردار انحرافی b در صورتی دارای دقت ماشین است که فقط از خطای بازنمود ناشی شده باشد، یا ممکن است بسته به محاسباتی که b̃ را ایجاد کرد، بزرگتر باشد.

حالا می­توان پرسید جه رابطه­ای بین مقدار دقیق x، که از انجام محاسبه د قیق با A و b بدست می­آید، که در واقع غیرعملی است، و مقدار محاسبه شده x̃ وجود دارد که از محاسبه با A و b̃ بدست می­آوریم. (در  این بحث فرض می­کینم خود A دقیق است، اما این فرض ساده­سازی است.)

با نوشتن x̃ = x + x، نتیجه محاسبه عبارت است از

Ax̃ = b̃

یا

A(x + x) = b + b.

چون Ax = b است، داریم Ax = b. از روی این رابطه داریم (برای جزئیات بیشتر رجوع کنید به ضمیمه 16)

 

مقدار ||A|| ||A-1|| عدد شرط ماتریس نامیده می­شود. بنابراین حد (3.2) می­گوید هر انحرافی در سمت راست می­تواند منجر به انحراف در جواب می­شود که نهایتاً با عدد شرط ماتریس A بزرگتر است. توجه داشته باشید که این به این معنی نیست که انحراف در x باید در جایی نزدیک به این اندازه باشد، بلکه نمی­توانیم آن را کنار بگذاریم و در برخی موارد این حد حاصل می­شود.

فرض کنید b تا حد دقت ماشین دقیق است، و عدد شرط A، 104 است. حد (3.2) اغلب اینگونه تفسیر می­شود که 4 رقم آخر x نامطمئن است، یا در محاسبه درستی 4 رقم از بین می­رود.

معادله (3.2) را می­توان به این شکل نیز تفسیر کرد: وقتی سیستم خطی Ax = b را حل می­کنیم جواب تقریبی x + x را بدست می­اوریم که جواب دقیق سیستم انحراف است A(x + x) = b + b. این واقعیت که انحراف در جواب ممکن است به انحراف در سیستم مربوط باشد با بیان اینکه الگوریتم ثبات روبه عقب را نشان می­دهد گفته می­شود.

تجزیه و تحلیل درستی الگوریتم­های جبری خطی خودش یک حوزه مطالعاتی محسوب می­شود؛ رجوع کنید به کتال Higham [86].

3.3.6. خطای گرد کردن در محاسبات موازی

از روی مثال بالا با جمع زدن سری دیدیم که جمع در حساب کامپیوتری شرکت­پذیر نیست. واقعیت مشابهی در مورد ضرب نیز صدق می­کند. نتیجه جالب محاسبات موازی این است: شیوه­ای که محاسبه در پردازشگرهای موازی گسترده می­شود بر نتیجه تاثیرگذار است.

به عنوان مثالی کاملا ساده، محاسبه مجموع چهار عدد a + b + c + d را در نظر بگیرید. در یک پردازشگر، اجرای معمولی معادل است با شرکت­پذیری زیر:

((a + b) + c) +d.

از سوی دیگر، با گسترش این محاسبه در دو پردازشگر، که پردازشگر 0، a و b رادارد و پردازشگر 1، c و d را دارد، معادل است با

((a + b) + (c + d)).

ببا تعمیم این رابطه، می­توان دید که عملیات کاهش به احتمال رزیاد نتیجه متفاوتی در تعداد متفاوت پردازشگر خواهد داد. (استاندارد MPI می­گوید دو برنامه که در یک مجموعه پردازشگر اجرا می­شوند باید نتیجه یکسان دهند.) می­توان با جایگزینی عمل کاهش با عمل گردآوری ( gather) برای همه پردازشگرها از این مسئله دوری کرد، که سپس کاهش محلی انجام می­دهد. اما اینکار نیاز به حافظه را برای پردازشگرها ا فزایش می­دهد.

راه حل برانگیزنده دیگری برای حل مسئله جمع موازی وجود دارد. اگر مانتیس 4000 بیت را برای ذخیره کردن عدد با ممیز شناور بکار بریم، نیازی به توان نداریم و همه محاسبات با اعداد ذخیره شده به این ترتیب دقیق هستند زیرا شکلی از محاسبه ممیز ثابت (نقطه ثابت) هستند [102، 101]. با اینکه انجام کل محاسبه با چنین اعدادی بیفایده خواهد بود، حفظ این جواب فقط برای محاسبه ضمنی ضرب نقطه­ای، ممکن است راه حل مسئله قابلیت بازتولید باشد.

3.4. کمپایلرها و گرد کردن

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

 

این یعنی کمپایلر نمی­تواند بدون تاثیر بر رفتار گرد کردن، بهینه­سازی­های خاصی را انجام دهد. در برخی کدها چنین تفاوت­ها جزئی می­تواند قابل تحمل باشد، برای مثال چون متد حفاظ درونی دارد. مثلاً متدهای تکراری ثابت بخش 5.5 هرگونه خطای ایجاد شده را دفع می کنند.

از سوی دیگر، اگر برنامه نویس کدی را برای در نظر گرفتن رفتار گرد کردن نوشته باشد، کمپایلر چنین آزادی ندارد. این امر در تمرین 3.5 در بالا عنوان شد. ما از مفهوم ایمنی مقدار استفاده می کنیم تا توضیح دهیم که کمپایلر چگونه می تواند تفسیر محاسبه را تغییر دهد. کمپایلر مجاز نیست تغییری ایجاد کند که نتیجه محاسبه را تحت تاثیر قرار دهد.

بعلاوه اگر قابلیت بازتولید نتایج هم مد نظرتان باشد، این مسائل مهم هستند. اگر کد بوسیله دو کمپایلر گردآوری شده باشد، آیا باید با ورودی یکسان خروجی یکسان دهد؟ آیا کد در دو پیکربندی متفاوت پردازشگر به صورت موازی اجرا می شود؟ این پرسش ها بسیار اساسی هستند. در مورد اول، گاهی افراد بر قابلیت بازتولید بیت به بیت اصرار دارند، در صورتیکه در مورد دوم، مادامیکه نتیجه به اندازه کافی معادل باشد، برخی تفاوت­ها مجاز است. البته بیان دقیق این مفهوم دشوار است.

برخی مسائل مرتبط در بررسی تاثیر کمپایلر بر رفتار کد و قابلیت بازتولید در زیر آمده است.

شرکت­پذیری دوباره: از بین تغییراتی که کمپایلر می­تواند در محاسبه انجام دهد شرکت­پذیری است، عبارتی فنی برای دسته­بندی a + b + c به صورت a + (b + c).  استاندارد زبان C و استاندارد زبان C ++ ارزیابی چپ به راست عبارات را بدون پارانتز توصیه می­کند، بنابراین براساس استاندارد، شرکت­پذیری دوباره مجاز نیست. استاندارد زبان Fortan چنین توصیه­ای ندارد.

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

منبع اساسی­تر برای شرکت­پذیری دوباره اجرای موازی است؛ رجوع کنید به بخش 3.3.6. این یعنی نباید خروجی کد دقیقا بین دو اجرا در پیکربندی­های موازی متفاوت قابل بازتولید باشد.

ارزیابی عبارت: در ارزیابی عبارت a + (b + c)، پردازشگر نتیجه فوری برای b + c ایجاد می­کند که به هیچ متغیری اختصاص ندارد. بسیاری از پردازشگرها قادرند دقت بالاتری در نتیجه فوری داشته باشند. کمپایلر فقط می­تواند استفاده یا عدم استفاده از این امکان را دیکته کند.

رفتار واحد ممیز شناور: رفتار گرد کردن و رفتار پاریز تدریجی ممکن است با توابع کتابخانه­ای (یا مجموعه توابع، library functions)کنترل شود.

توابع کتابخانه­ای: استاندارد IEEE 754 فقط عملیات ساده را عنوان می­کند؛ تاکنون استانداردی وجود نداشته است که توابع سینوسی را لگاریتمی را دربرگیرد. بنابراین ممکن است اجرا آنها عامل تغییرپذیری باشد.

3.5. توضیح بیشتر درباره حساب ممیز شناور

3.5.1. زبان­های برنامه­نویسی

زبان­های مختلف روش­های مختلف برای بیان اعداد صحیح و اعداد ممیز شناور استفاده می­کنند.

زبان فرترن: در فرترن راههای مختلفی برای مشخص کردن فرمت ذخیره اعداد صحیح و متغیرهای حقیقی وجود دارد.  برای مثال، می­توان تعداد بیت­های لازم برای ذخیره متغیر را عنوان کرد: INTEGER*2, REAL*8. یکی از مزایای این روش قابلیت بازتولید آسان با زبان­های دیگر یا مجموعه MPI است.

غالبا می­توان کدی را با استفاده از فقط INTEGER, REAL  نوشت و از فلاگ کمپایلر برای نشان دادن اندازه عدد  صحیح یا  حقیقی بر حسب بایت استفاده کرد.

به عبارتی دقیق­تر، نسخه جدید فرترن می­تواند تعداد دقیق ارقام عدد با ممیز شناور را نشان دهد:

 

مقدار "نوع" معمولاً 4، 8، 16 خواهد بود اما به کمپایلر بستگی دارد.

C: در زبان C طول شناساگر نوع استاندارد نیست. برای اعداد صحیح short, int, int, long, int، و برای ممیز شناور float, double وجود دارد. عملگر size of () تعداد بایت بکار رفته برای ذخیره نوع داده را می­دهد.

C99، فرترن 2003: استانداردهای اخیر زبان C و فرترن استاندارد قابلیت کار باهم زبان C و فرترن را دربر می­گیرند، که می­توان برای بیان نوع در یک زبان بکار برد تا با نوع خاصی در زبان دیگر هماهنگ باشد.

3.5.2. سیستم­های دیگر حساب کامپیوتر

سیستم­های دیگری برای پرداختن به مسائل دقیق نبودن حساب در کامپیوترها پیشنهاد شده­اند. یک از این راه­حل­ها حساب گسترش دقت است، که اعداد در بیت بیشتر از معمول ذخیره می­شود. یکی از استفاده­های معمول این روش در محاسبه ضرب نقطه­ای (ضرب داخلی هرمیتی) بردارهاست: تراکم به صورت داخلی با دقت گسترده انجام می­گیرد، اما به صورت عدد با ممیز شناور معمولی برگردان می­شود. یا مجموعه­هایی (کتابخانه­هایی) مثل GMPlib [65] وجود دارد که امکان انجام هر محاسبه­ای را با دقت بیشتر فراهم می­کنند.

راه حل دیگر برای بی­دقتی حساب کامپیوتر "حساب بازه" است [91]، که برای هر بازه محاسبه مرزهایی مشخص می­شود. گرچه مدت زیادی است که روی این روش تحقیق شده است اما بیش از روش­های دیگر در کتابخانه­های تخصصی بکار نرفته است [17].

3.5.3. دقت گسترده

وقتی استاندارد IEEE 754 تدوین شد، پیش بینی می شد پردازشگر کل دامنه دقت را داشته باشند. در عمل، فقط تک دقتی و دقت مضائف بکار رفته است. با این حال، یکی از موارد دقت گسترده هنوز باقی است: گاهی پردازشگرها رجیسترهای 80 بیت برای ذخیره نتایج فوری دارند. (این به هم-پردازشگر Intel 80287 برمی­گردد). این استراتژی در زیرساخت­های FMF و در تراکم ضرب نقطه­ای به درد می­خورد.

3.5.4. حساب ممیز ثابت   

عدد با ممیز ثابت (برای بحث کامل رجوع کنید به [168]) را می­توان به صورت <N, F> بازنمود کرد که در آن N β0 قسمت صحیح است و F < 1 قسمت کسری است. راه دیگر این است که عدد با ممیز ثابت عدد صحیحی است که در N + F رقم ذخیره می­شود، که ممیز به صورت ضمنی بعد از N رقم قرار می گیرد.

محاسبات ما ممیز ثابت ممکن است سرریز باشد، و امکان تنظیم توان وجود نداشته باشد. این ضرب را در نظر بگیرید <N1, F1> × <N2, F2> که در آن N1 βn1 و N2 βn2 است. این در صورتی سرریز می شود که n1 + n2 بیشتر از تعداد جای موجود برای قسمت عدد صحیح باشد. (یعنی تعداد ارقام حاصل مجموع ارقام اپراندها باشد.) این یعنی در برنامه­ای که از ممیز ثابت استفاده می کند، اعداد باید تعدادی رقم صفر داشته باشند، اگر بخواهید آنها را ضرب کنید، که دقت عددی را کاهش می دهد. هم چنین به این معنی است که برنامه نویس باید  درباره محاسبات بیشتر فکر کند، و آنها را طوری مرتب کند که سرریز روی ندهد، و در عین حال دقت عددی با حد قابل قبولی حفظ شود.

پس چرا از اعداد با ممیز ثابت استفاده می شود> یکی از کاربردهای مهم در دستگاههای با توان پایین است، مثل دماسنج دیجیتالی که با باتری کار می کند. چون محاسبات با ممیز ثابت اساساً همانند محاسبات عدد صحیح هستند، نیازی به واحد ممیز شناور ندارند، در نتیجه اندازه تراشه کاهش می یابد و نیاز به توان (مصرف نیرو) کم می شود. هم چنین بسیاری از سیستم­های بازی ویدیویی اولیه پردازشگری دارند که یا واحد ممیز شناور ندارند یا واحد عدد صحیح در حد قابل توجهی سریع تر از واحد ممیز شناور است. در هر دو حالت، اجرای محاسبات غیرعدد صحیح به صورت  ممیز ثابت، با استفاده از واحد عدد صحیح، کلید توان عملیاتی (خروجی) بالاست.

حوزه دیگری که هنوز حساب ممیز ثابت بکار می­رود در پردازش سیگنال است. در CPUهای مدرن، عملیات عدد صحیح و ممیز شناور با سرعت برابر هستند، اما تبدیل بین آنها نسبتاً آهسته است. حالا اگر تابع سینوسی از طریق مراجعه به جدول اجرا شود، این یعنی در sin (sin x) خروجی تابع برای ایندکس کاربری تابع بعدی بکار می­رود. روشن است که خروج تابع سینوسی با ممیز ثبات نیاز به تبدیل بین اعداد صحیح و حقیقی را برطرق می­کند، که منطق تراشه لازم را ساده می­سازد و به محاسبات سرعت می­بخشد.

3.5.5. اعداد مرکب

در برخی زبان­های برنامه نویسی اعداد مرکب به عنوان نوع داده بومی است، و برخی مابین قرار دارند. برای مثال، در زبان فرترن می توانید بگویید

 

عدد مرکب یک جفت عدد حقیقی، قسمت حقیقی و مجازی، است که کنار هم در حافظه قرار می­گیرند. عبارت اول از 8 بایت برای ذخیره اعداد REAL * 4 استفاده می­کند، و دومی Real * 8 برای قسمت حقیقی و مجازی دارد. (یا از DOUBLE COMPLEX یا در فرترن 90، COMPLEX (KID=2) بکار می رود.)

برعکس، زبان C اعداد مرکب بومی ندارد، بلکه C99 و C++ هر دو فایل هدر complex.h دارند. این عدد مرکب را همانند فرترن به صورت دو عدد حقیقی تعریف می کند.

ذخیره عددی مرکب مانند این آسان است اما گاهی از نظر محاسباتی بهترین راه حل نیست. این امر زمانی مشخص است که آر ایه­های اعداد مرکب مد نظر است. اگر محاسبه منحصراً بر دسترسی به قسمت­های حقیقی (یا مجازی) اعداد مرکب متکی باشد، پیشرفت در ارایه اعداد مرکب با stride دو است، که سودمند نیست. (رجوع کنید به بخش 1.3.4.6). در این مورد، بهتر است یک آرایه برای هر قسمت حقیقی اختصاص یابد و آرایه دیگری برای قسمت­های مجازی تخصیص یابد.

تمرین 3.13. فرض کنید آرایه­ای از اعداد مرکب به صورت فرترن ذخیره شده است. الگوی دسترسی حافظه به صور ت ضرب جفت جفت آرایه­ها را تجزیه و تحلیل کنید، یعنی : ci ai.bi i ، که در آن a (), b (), c ()  آرایه­های اعداد مرکب هستند.

تمرین 3.14. نشان دهید که سیستم n × n خطی Ax = b در اعداد مرکب را می­توان به صورت سیستم 2n×2n روی اعداد حقیقی نوشت. راهنمایی: ماتریس را بردارها را به قسمت حقیقی و مجازی تفکیک کنید. کارآیی ذخیره آرایه­های اعداد مرکب را به صورت آرایه­های مجزایی از قسمت­های حقیقی و مجازی بحث کنید.

 

3.6. نتیجه­گیری­ها

محاسباتی که در کامپیوتر انجام می گیرد با خطای عددی همراه است. دلیل خطا دقیق نبودن حساب کامپیوتری است: اگر می­توانستیم با اعداد حقیقی واقعی محاسبه کنیم، مشکلی نبود. (بازهم مسئله خطای اندازه­گیری در داده­ها وجود داشت، و برآوردهای تقریبی که در روش­های عددی مختلف صورت می گیرد، رجوع کنید به فصل بعد.) با این حال، اگر گرد کردن را به عنوان واقعیتی از زندگی قبول کنیم، مشاهدات مختلفی صدق خواهد کرد:

  • لزومی ندارد که عملیاتی که از نظر ریاضی معادل هستند از دیدگاه پایایی رفتار همسان داشته باشند؛ رجوع کنید به مثال ‘abc-formula’.
  • حتی بازآرایی محاسبات یکسان نیز رفتاری همسان ندارد؛ رجوع کنید به مثال جمع.

بنابراین باید الگوریتم­های کامپیوتری برحسب رفتار گرد کردن تجزیه و تحلیل شوند: آیا گرد کردن به صورت تابعی با رشد آهسته از پارامترهای مسئله، مثل تعداد جملات ارزیابی شده، افزایش می­یابد، یا آیا رفتار بدتری احتمال می­رود؟ در این کتاب به  تفصیل به این پرسش­ها می­پردازیم.

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی