الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في استخدام دالة Floor

بدأه Islamic_Empire في 24 أكتوبر 2009 · 1 رد · 974 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

أخوتي قمت بكتابة دالة لتحويل أي عدد عشري إلى عدد صحيح مثلا

.23 -> 23
.345 -> 345

وهذا هو الكود :

// checks if two double numbers are equal 
bool doub_equal(double,double);
// returns the integer form of any floating value but must include cmath
int ret_int(double);

void main()
{
 double aaa;
 cin >> aaa;

 cout << ret_int(aaa) << endl;

}

bool doub_equal(double x , double y)
{
 if( x-y < 1e-6 && x-y > -1e-6)
  return true;
 else
  return false;
}

int ret_int(double input)
{
 while(true)
 {
  cout << input << "  " << floor(input) << endl; // this line is for debugging 

 if( doub_equal(input,floor(input)) )  return input;
 input = input * 10;
 }
}

ممكن حد يسألني إيش وظيفة doub_equal

ببساطة لأن مساواة رقمين عشريين قد يعطي نتائج غير صحيحة:

الحين الكود يعطيني نتائج صحيحة ولكن في بعض الأحيان دالة floor تعطي نتائج غريبة :

مثلا

input .2345

wrong answer 

floor(2345) = 2344

اتمنى من الاخوة تجربة الكود وادخال .2345 الدالة floor تعطي نتائج خاطئة

إذا أحد من الإخوة عنده طريقة أخرى فليتفضل

#2

أخي العزيز, ببساطة لا يمكنك فعل ما تريد. عندما يكون الخطأ التقريبي أكبر من الصفر كما في حالة العدد 0.2345 فإن هذا العدد لا يمكن تمثيله كعدد ذو فاصلة ثنائي. و عندما نريد التحويل من جديد, ستذهب عملية التحويل إلى مالانهاية.

لو وجدت الموضوع معقداً في السطر في الأعلى, فهو بالفعل معقد. لابد أن تحدد الدقة التي تريد العمل بها, لايمكنك افتراض دقة لا نهائية. يجب أن تقوم بهذا الشيء بشكل يدوي.

تحياتي...

مواضيع مشابهة