ترجمه متون ریاضی انگلیسی به فارسی
ریاضی کامپیوتر
از بین انواع دادهای که معمولا مواجه میشویم، دادههایی که معمولا در زمینه رایانش علمی میبینیم از نوع عددی هستند: اعداد صحیح (یا عدد کامل) . . . ., -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̃ بازنمود برای هر 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 است، داریم A∆x = ∆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’.
- حتی بازآرایی محاسبات یکسان نیز رفتاری همسان ندارد؛ رجوع کنید به مثال جمع.
بنابراین باید الگوریتمهای کامپیوتری برحسب رفتار گرد کردن تجزیه و تحلیل شوند: آیا گرد کردن به صورت تابعی با رشد آهسته از پارامترهای مسئله، مثل تعداد جملات ارزیابی شده، افزایش مییابد، یا آیا رفتار بدتری احتمال میرود؟ در این کتاب به تفصیل به این پرسشها میپردازیم.