عندما تتلقى خطأ “Floating Point Exception”، فإن ذلك يعني أن هناك مشكلة تتعلق بالعمليات على الأرقام العائمة (floating-point) في البرنامج. في الكود الذي قدمته، يبدو أن المشكلة تكمن في قسمة العددين this->numerator
و this->denominator
على i
في كل دورة من دورات الحلقة while
، خصوصاً عندما تكون قيمة i
تساوي الصفر.
عندما تكون قيمة i
تساوي الصفر، فإن العملية this->numerator / i
أو this->denominator / i
تؤدي إلى قسمة عدد على الصفر، مما يسبب حدوث خطأ “Floating Point Exception”.
-
لغة Go: بساطة وأداء في عالم البرمجة19/01/2024
-
مقارنة سلاسل C# بدون حساسية لحالة الأحرف24/02/2024
-
منح إذن USB تلقائيًا في Xamarin23/03/2024
لتجنب هذا الخطأ، يجب أن تتحقق من قيمة i
قبل القيام بالقسمة. يمكنك تحقق قيمة i
قبل القسمة بإضافة شرط إلى الحلقة while
للتأكد من أن قيمة i
لا تساوي الصفر. على سبيل المثال:
cppint i = this->numerator;
while (i > 1) {
if ((this->numerator % i == 0) && (this->denominator % i == 0)) {
this->numerator = this->numerator / i;
this->denominator = this->denominator / i;
}
i = i - 1;
// Add this condition to avoid division by zero
if (i == 0) {
break;
}
}
بهذه الطريقة، سيتم تجنب قسمة عددي numerator
و denominator
على صفر، مما يمنع حدوث خطأ “Floating Point Exception”.
المزيد من المعلومات
خطأ “Floating Point Exception” يحدث عندما يتم محاولة القيام بعملية غير مشروعة على الأرقام العائمة، مثل القسمة على صفر أو استخدام قيم غير صالحة للعمليات الحسابية.
في حالتك، يبدو أن المشكلة تحدث عندما تكون قيمة i
تساوي الصفر، مما يؤدي إلى محاولة القسمة على صفر في التعليمة this->numerator / i
أو this->denominator / i
، مما يؤدي إلى حدوث الخطأ. لتجنب هذا، يمكنك إضافة شرط إلى الحلقة while
للتحقق من أن قيمة i
لا تساوي الصفر قبل القيام بالقسمة.
يمكنك أيضًا تحسين كفاءة الكود من خلال تحسين خوارزمية تبسيط الكسور. بدلاً من تنازلياً من i
إلى 1، يمكنك استخدام حلقة تنازلية تبدأ من القيمة الصغرى بين this->numerator
و this->denominator
وتنتهي عند 1، مع التحقق من قابلية القسمة على القيم المتدنية.
هذا الشكل الجديد للكود يمكن أن يساعد في تجنب الأخطاء ويجعل الكود أكثر فعالية:
cppint gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
int gcd_value = gcd(this->numerator, this->denominator);
this->numerator /= gcd_value;
this->denominator /= gcd_value;
في هذا الكود، نستخدم دالة gcd
لحساب أكبر قسم مشترك للقسمة (GCD) بين this->numerator
و this->denominator
، ثم نقوم بتقسيم الجزء العلوي والسفلي للكسر على هذا القيمة.