اگه جزء افرادی هستین که با نرمافزار MATLAB سر و کار دارین، حتما این مطلب رو بخونین تا به مشکلی که حدود یک ماه وقت من رو الکی گرفت بر نخورین.
یک ماهی بود که من از برنامهای که نوشته بودم جواب دلخواهم رو نمیگرفتم.
تو برنامه متغیری بود که مقدارش به صورت اعشاری زیاد میشد و بعد با عدد ۱ مقایسه میشد که اگر مقدارش ۱ شده باشه یک سری دستورات اجرا بشه. ولی اون دستورات هیچوقت اجرا نمیشدن و چون برنامه حجمش کمی زیاد بود، پیدا کردن این که مشکل از اجرا نشدن این قسمته تا وقتی که برنامه رو کاملا دقیق دیباگ نکردم معلوم نشد.
قضیه از این قراره که اعداد اعشاری و صحیح برای MATLAB متفاوت هستن.
در واقع جواب کد زیر در MATLAB برابر یک نخواهد شد و مقدار صفر رو برمیگردونه:
(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1) == 1
دلیلش هم اینه که MATLAB جواب اون جمع رو به صورت یک عدد اعشاری میشناسه (1.0000) و این عدد اعشاری نسبت به عدد صحیح ۱، یک بیت اضافه داره و در نتیجه این دو مقدار برای MATLAB برابر نخواهند بود.
راه حل این مشکل استفاده از کدی مانند کد زیر است:
(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1) - 1 <= eps
این یعنی اگر اختلاف عدد حاصل از عدد ۱ خیلی کم و در حد اپسیلن باشه، مقدار درستی (یعنی ۱) برگردونده بشه.
حالا نکتهی جالب اینجاست که نمیشه پیشبینی کرد (یا حداقل من قانونشو نمیدونم) که MATLAB چه موقع مقادیر رو به صورت صحیح و چه موقع به صورت اعشاری در میاره. کد زیر:
(0.5 + 0.5) == 1
بر خلاف اولین کد مقدار درستی رو برمیگردونه چون MATLAB مقدار به دست اومده رو به عدد صحیح ۱ و نه به صورت اعشار تبدیل میکنه.
پس برای اینکه تو برنامههاتون به مشکلات بیهوده برخورد نکنین و وقتتون گرفته نشه لطفا در استفاده از اعداد اعشاری و صحیح خیلی دقیق باشید.
منم دیروز با این مشکل مواجه شدم ... زود پیدا کردم مشکل رو .. امروز هم برا حلش سرچ کردم مطلب شما رو دیدم... ممنون .. آیا راهی وجود نداره که 1 رو به صورت اعشاری در بیاریم؟ یعنی 1 رو تبدیل کنیم به 1.0000؟
پاسخحذفسلام.
پاسخحذفخوشحالم که این مطلب واستون مفید بوده.
لطفا نگاهی به پست بعدی هم بیاندازید:
http://flight-to-infinity.blogspot.com/2011/08/blog-post_10.html
و مقاله ی ذکر شده در اون پست رو بخونید.
در واقع مساله این نیست که عددی رو خود به خود به صورت اعشاری بشناسه. مساله اعدادی هستن که معادل دودویی دقیقی در سیستم ذخیره ی کامپیوتر ندارن و در نتیجه یک عدد نزدیک به اون ها با دقت بالا در نظر گرفته می شه (که به سادگی نمی شه فهمید عدد بعدیه یا قبلی). در نتیجه ممکنه در محاسبه این اعداد باعث ایجاد تفاوت در جواب بشن. اگر اون مقاله رو بخونین همه ی این ها رو توضیح داده.