دقت محاسباتی در رایانه — به زبان ساده

۴۱۸ بازدید
آخرین به‌روزرسانی: ۲۹ خرداد ۱۴۰۲
زمان مطالعه: ۶ دقیقه
دقت محاسباتی در رایانه — به زبان ساده

کاهش دقت محاسبات، یک اثر نامطلوب در انجام عملیات ریاضی است که به علت استفاده از تعداد ارقام مشخصی از اعداد اعشاری رخ می‌دهد. معمولا مشکل زمانی به وقوع می‌پیوندد که براساس دو عدد اعشاری گرد شده (Round) عملیات ریاضی انجام می‌شود. در این حالت خطای مطلق (Absolute Error) در هر دو عدد کمتر از خطای نسبی (Relative Error) خواهد بود. به عنوان مثال در تفریق دو عدد تقریباً برابر که یکی دارای تعداد ارقام بیشتری نسبت به دیگری است، اثر معروف به «حذف فاجعه‌بار» (catastrophic cancellation) رخ می‌دهد. در این متن به بررسی دقت محاسباتی در رایانه پرداخته و وجود اثر حذف فاجعه‌بار را در انجام عملیات ریاضی مرور می‌کنیم.

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

دقت محاسباتی در رایانه

«کاهش دقت محاسباتی» (Loss of Significant) را می‌توان با محاسبات ساده روی اعداد اعشاری نشان داد. مثال زیر بیانگر کاهش دقت محاسبات برای یک اعداد اعشاری است. حالتی را در نظر بگیرید که سیستم محاسباتی قادر به انجام عملیات فقط روی ۱۰ رقم اعشار است. فرض کنید $$x$$ و $$y$$ اعداد مورد نظر باشند که اولی دارای ۲۰ رقم و دومی ۱۰ رقم اعشار دارد.

$$ \large x = 0.1234567891234567890$$

$$ \large y = 0.1234567891 $$

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

دقت اندازه‌گیری برای مقدار $$y$$ برابر با $$ 10 \times 10^{-10}$$ است، در حالی که مقدار $$x$$ دقتی برابر با $$ 10 \times 10^{19}$$ دارد. اکنون تفاضل این دو عدد را به شکل زیر انجام می‌دهیم.

$$ \large x - y = 0.1234567891234567890 − 0.1234567890000000000 $$

پاسخ، با دقت ۲۰ رقم اعشار به شکل زیر است.

$$ \large 0.0000000001234567890$$

با این حال، اگر دستگاه محاسباتی یا رایانه ما دارای دقت ۱۰ رقم اعشار باشد، نتیجه برابر است با:

$$ \large 0.1234567891 − 0.1234567890 = 0.0000000001 $$

در هر دو مورد نتیجه به همان ترتیب دارای دقت ۲۰ رقم و ۱۰ رقم اعشار است. در حالت دوم، به نظر می‌رسد که پاسخ بدست آمده، دارای فقط یک رقم معنی‌دار است که باعث کاهش دقت محاسباتی شده است.

به هر حال، در محاسبات رایانه‌ای روی اعداد اعشاری همه عملیات بوسیله عملگر «پادلگاریتم» (AntiLogarithm) یا توابع نمایی، صورت می‌گیرد که تعداد ارقام اعشاری معنی‌دار در نتایج محاسباتی براساس دقت کوچکترین «مانتیس» (Mantisa) تعیین می‌شود. به این ترتیب دقت محاسبات بالا را به صورت زیر نشان می‌دهند.

$$ \large 1.000000000 \times 10^{−10} $$

راه حل برای از دست ندادن دقت

در رایانه‌ها، انجام محاسبات با استفاده از نمایش دقیق کسری از اعداد گویا (Rational Numbers) امکان پذیر است و تمام ارقام با معنی را حفظ می‌کند، ولی متاسفانه انجام محاسبات با این روش بسیار کندتر از عملیات با ممیز شناور (Floating Point) است.

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

حفظ ارقام یا بیت‌های معنی‌دار

اجاره دهید، $$x$$ و $$y$$ که در قسمت قبل مورد استفاده قرار گرفتند به صورت عادی و به شکل ممیز شناور ثبت و در نظر گرفته شوند. در این قسمت سعی داریم مشخص کنیم که در عمل تفریق $$x - y $$، بیت های با اهمیت و معنی‌دار در کجا گم یا نادیده گرفته می‌شوند. در رابطه زیر، $$r$$ تعداد بیت‌های گمشده را تعیین می‌کند.

$$ \large {\displaystyle q \leq r \leq p،} \\ \large 2^{- p} \leq 1 - {\frac {y} {x}} \leq 2 ^ {- q} \\ \large $$

رابطه ۱: تعداد ارقام (بیت‌های) معنی‌دار گمشده در عمل تفاضل $$x-y$$

توجه داشته باشید که در رابطه ۱، دو مقدار $$p$$ و $$q$$ مثبت هستند.

ناپایداری در پاسخ‌های معادله درجه دوم

مسئله دیگری که با توجه به تعداد ارقام اعشار و دقت محاسباتی، بروز می‌کند، پاسخ‌های مربوط به معادله درجه دوم (Quadratic Equation) است. به عنوان مثال، معادله درجه دوم زیر را در نظر بگیرید.

$$ \large {\displaystyle ax^{2} + bx + c = 0} $$

پاسخ‌های دقیق برای این معادله به شکل زیر خواهند بود.

$$ \large {\displaystyle x = {\frac { - b \pm { \sqrt {b^{2} - 4 a c }}}{2 a}}}$$

رابطه ۲: پاسخ‌های معادله درجه دوم

نتیجه محاسبات برای این فرمول همیشه مقداری متعلق به مجموعه اعداد صحیح (Integer Number) نیست و ممکن است با از دست دادن دقت در محاسبات همراه باشد. به عنوان مثال، هنگامی که $$\displaystyle c $$ بسیار کوچک باشد، با توجه به علامت $$\displaystyle b$$، از دست دادن دقت در محاسبه هر یک از ریشه‌های چه با مقدار مثبت یا منفی، ممکن است رخ دهد.

حالتی را در نظر بگیرید که در معادله مربوط به رابطه ۲، $$ {\displaystyle a = 1}، {\displaystyle b = 200}، {\displaystyle c = -0.000015} $$ باشد. برای نشان دادن مشکل از دست رفتن دقت در محاسبات از معادله زیر استفاده می‌کنیم.

$$ \large x^{2} + 200 x - 0.000015 = 0 $$

به این ترتیب داریم:

$$ \large {\sqrt {b^{2} - 4 a c }} = {\sqrt {200^{2} + 4 \times 1 \times 0.000015}} = 200.00000015 \dotso $$

پاسخ‌های مربوطه در مجموعه اعداد حقیقی (Real Numbers) به شکل زیر خواهند بود.

$$ \large {\displaystyle (-200 - 200.00000015 )/2 = -200.000000075,} \\ \large {\displaystyle (-200 + 200.00000015)/2 = 0.000000075} $$

اگر پاسخ‌ها را با ۱۰ رقم اعشار در نظر بگیریم، خواهیم داشت:

$$ \large { \displaystyle ( -200 - 200.0000001)/2 = -200.00000005,} \\ \large{ \displaystyle (-200 + 200.0000001)/2 = 0.00000005.} $$

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

یک الگوریتم بهتر برای حل معادله درجه دوم

اجرای دقیق محاسبات مربوط به ممیز شناور با استفاده از چندین استراتژی برای ایجاد یک نتیجه قوی توسط رایانه‌ها صورت می‌گیرد. با فرض اینکه $$ \displaystyle b^2 - 4ac $$ مثبت و $$b$$ نیز غیر صفر در نظر گرفته شود، محاسبات مربوط به پیدا کردن ریشه‌های معادله درجه دوم، به شرح زیر قابل تغییر است:

$$ \large {\displaystyle {\begin{aligned}x_{1}&  ={\frac { -b - \operatorname {sgn}(b)\,{\sqrt {b^{2} - 4 a c}}}{2 a}},\\ \large x_{2}& = {\frac {2 c}{- b - \operatorname {sgn}(b)\,{\sqrt {b^{2} - 4 a c}}}} = {\frac {c}{a x_{1}}}.\end{aligned}}} $$

رابطه ۳: محاسبه ریشه‌های معادله درجه ۲ برحسب تابع علامت

در اینجا sgn، تابع علامت (Sign Function) را نشان می‌دهد. به این معنی که مقدار $$ {\displaystyle \operatorname {sgn} (b)} $$ برابر با ۱ است اگر $$b$$ مثبت باشد و با منفی بودن آن مقدار تابع ۱- خواهد بود. در صورتی که $$b=0$$ باشد، تابع علامت مقداری برابر با صفر خواهد داشت. توجه دارید که با در نظر گرفتن $$b \neq 0  $$ از وجود ریشه مضاعف صرف نظر کرده‌ایم.

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

$$ \large x_1 = 1.786737589984535 \\ \large x_2 = 1.149782767465722 \times 10^{-8} $$

به این ترتیب با استفاده از دقت مضاعف (Double Precision) که در آن ۱۶ رقم اعشار در نظر گرفته می‌شود، شکل معادله درجه دوم به صورت زیر در می‌آید.

$$ \large {\displaystyle x^{2} - 1.786737601482363 x + 2.054360090947453 \times 10^{-8} = 0} $$

با استفاده از فرمول محاسبه ریشه‌های درجه دوم استاندارد و حفظ 16 رقم اعشار معنی‌دار در هر مرحله، ریشه‌ها به شکل زیر حاصل می‌شوند.

$$ \large {\displaystyle {\sqrt {\Delta }} = 1.786737578486707,} \\ \large {\displaystyle x_{1} = (1.786737601482363 + 1.786737578486707) / 2 = 1.786737589984535,}\\ \large {\displaystyle x_{2} = (1.786737601482363 - 1.786737578486707) / 2 = 0.000000011497828.} $$

توجه داشته باشید که چگونه حذف ارقام اعشار با اهمیت در محاسبات منجر به کاهش دقت محاسباتی در ریشه‌های $$x_1 , x_2 $$ شده است. مشخص است که ریشه $$x_2$$ فقط از ۸ رقم اعشار معنی‌دار تشکیل شده است.

ولی فرمول مربوط به رابطه ۳، در اینجا باعث ایجاد خطای کاهش دقت هنگام تفریق دو عبارت $$ { \displaystyle b}$$ و $${ \displaystyle {\sqrt {b^{2}-4ac}}}$$ نمی‌شود.

$$ \large {\displaystyle x_{1} = ( 1.786737601482363 + 1.786737578486707)/2=1.786737589984535,}\\ \large {\displaystyle x_{2} = 2.054360090947453 \times 10^{-8}/ 1.786737589984535 = 1.149782767465722\times 10^{-8}} $$

به حفظ تمام ارقام معنی‌دار و قابل توجه برای $$ {\displaystyle x_ {2}} $$ توجه داشته باشید.

هنگامی که در محاسبه مقدار زیر رادیکال (دلتای معادله درجه دوم) تفاصل و هر یک از جمله‌ها با دقت مضاعف محاسبه شوند، ریشه دوم آن‌ها دارای دقتی بسیار کمتر خواهد شد. به همین دلیل برای از بین بردن مشکل کاهش دقت محاسبات، برای محاسبه جمله زیر رادیکال، از «دو برابر دقت مضاعف» یا «دقت چها برابر» (Quad Precision) کمک گرفته و به این ترتیب نتیجه حاصل دارای دقت مضاعف خواهد شد. این می تواند به صورت یک عمل «ضرب-جمع تفکیک شده» (Fused Multiply-add) صورت گیرد.

مقدار دلتا (Discriminant) یا مقدار زیر رادیکال رابطه ۳، برای این معادله به صورت زیر خواهد بود.

$$ \large { \displaystyle \Delta =7.5625} $$

در نتیجه ریشه‌ها به ترتیب برابر هستند با:

$$ \large { \displaystyle x_{1} = 1.000000028975958,} \\ \large { \displaystyle x_{2} = 1.000000000000000}$$

با این حال ، هنگامی که با استفاده از محاسبات با دقت مضاعف (با استاندارد IEEE 754) عملیات به 15 تا 17 رقم اعشار معنی‌دار، محاسبه می‌شود، ریشه‌های محاسبه شده برابر خواهند بود با:

$$ \large { \displaystyle x_{1} = 1.000000014487979,}\\ \large { \displaystyle x_{2} = 1.000000014487979,}$$

که هر دو بعد از رقم هشتم اعشار نادرست هستند. این موضوع اهمیت استفاده از دقت چهابرابر را نشان می‌دهد.

خلاصه و جمع‌بندی

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

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *