اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

مقابله با نتیجه‌ی اشتباه در عملیات اعداد اعشاری

0 امتیاز
381 نمایش

کد زیر رو در نظر بگیریم

float a, b, c;
cin>>a>>b>>c;
if(a*(b+c) == (a*b+a*c)) ...

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

if (a*(b+c) - (a*b+a*c) < numeric_limits<float>::epsilon())

سوال این جاست که می‌تونیم مطمئن باشیم که دیگه همه چیز درسته؟

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پرسیده شده پنجشنبه ۱۲ اردیبهشت ۱۳۹۲ در C++ توسط prodo  
بازتگ شده پنجشنبه ۱۷ مرداد ۱۳۹۲ توسط prodo

1 پاسخ

0 امتیاز

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

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

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده دوشنبه ۱۴ مرداد ۱۳۹۲ توسط prodo