مقایسه صحیح اعداد اعشاری
به نظر شما خروجی کُد زیر چیست؟
float pi = 3.14F; if(pi == 3.14) { printf("Equal!"); } else { printf("Not Equal!"); }
در کُد بالا عدد ۳٫۱۴ در متغیر pi قرار داده شده و سپس توسط دستور if، مقدار متغیر با عدد ۳٫۱۴ مقایسه شده است. به نظر شما در خروجی عبارت “Equal” چاپ خواهد شُد یا عبارت “Not Equal”؟
سوالی مشابه با این کُد در کانال تلگرام سایت تیچ تکس قرار گرفت و عدهی خیلی زیادی از دوستان پاسخ اشتباه دادند! و احتمالا هم شما به اشتباه عبارت “Equal” یا مساوی را انتخاب کردید!
شاید تعجب کنید، اما کُد بالا در خروجی عبارت دوم، یعنی عدم مساوری را چاپ خواهد کرد! این اتفاق به دلیل خطای ذاتی متغیرهای float است و متاسفانه بسیاری از برنامهنویسان از این مشکل خبر ندارند! این مشکل ربطی به نوع میکروکنترلری که استفاده میکنید ندارد و شامل تمامی میکروکنترلرها، از جمله میکروکنترلر ARM، میکروکنترلر AVR و سایر پردازنده است.
به عنوان مثال فرض کنید در برنامه مقدار دما را خوانده و با توجه به آن قرار است Heater را روشن یا خاموش کنید. اگر روش درست مقایسه اعداد اعشاری را ندانید، مطمعنا به مشکلاتی بر خواهید خورد که حتی دلیل وجود آنها را نمیدانید و به همین دلیل نمیتوانید آن مشکل را در برنامه حل کنید!
اگر چه این مشکل مربوط به ذخیره سازی اعداد طبق استاندارد IEEE-754 است. اما ما برای توضیح روش درست مقایسه اعداد اعشاری از میکروکنترلرهای Cortex-M و کامپایلر IAR استفاده کردیم.
در این ویدئوی آموزشی، با هم روش صحیح مقایسه اعداد اعشاری را یاد میگیریم و خواهیم دید که این خطای اعداد اعشاری در نرم افزار ماشین حساب خود ویندوز هم وجود دارد.
این آموزش فوق العاده از سایت TeachTechs.ir (تیچ تکس) را به هیچ عنوان از دست ندهید
با اشتراک این آموزش در شبکههای اجتماعی خود، به ما در ادامه تولید این آموزشها کمک کنید.
منتظر نظرات شما هستم