سؤال

وأنا فشلت في فهم بالضبط ما بيان IF يقوم به، من ما أستطيع أن أراه هو التحقق إذا كان x متغير تساوي 0 كثافة العمليات. إذا كان هذا هو true القيمة المطلقة للy متغير يتم إرجاعها ... هذا هو عندما تفقد مؤامرة، لماذا عبارة الإرجاع ثم انتقل إلى تشمل <= ESPILON؟ بالتأكيد هذا يعني أقل من أو يساوي قيمة إبسيلون؟ إذا كان الأمر كذلك كيف أن العمل؟ إذا كان هذا لا يعني أن ثم ماذا يعني ذلك؟

و(JAVA CODE)

final double EPSILON = 1E-14;
if (x == 0)
    return Math.abs(y) <= EPSILON;
هل كانت مفيدة؟

المحلول

والفاصلة العائمة الرياضيات بطبيعتها غير دقيقة، لذا بدلا من اختبار التكافؤ (والذي هو دائما فكرة سيئة)، بدلا المطور اختارت عددا صغيرا (1X10 ^ -14 في هذه الحالة)، والتسامح المقبول ل القرب من الصفر. بيان عودة بإرجاع المقارنة، لذلك هذا ما سوف تفعله هو أن تأخذ القيمة المطلقة للص، والعودة الحقيقية إذا وفقط إذا كانت قريبة بما فيه الكفاية إلى الصفر، حيث يتم تعريف قريب بما فيه الكفاية من قبل EPSILON.

نصائح أخرى

وويعود صحيحا إذا كانت القيمة المطلقة ذ هو <= EPSILON، وكاذبة خلاف ذلك. و<= يتم تقييم قبل عبارة العودة. هذا الرمز هو ما يعادل:

if(x == 0)
{
   boolean ret = Math.abs(y) <= EPSILON;
   return ret;
}

لا تقرأ كود ببساطة من اليسار إلى اليمين. والمثال الأبسط هو

int x = 3 + 4 * 5;

وبعد تقييم هذه، x هو 23 وليس 35. تقييم هو 3 + (4 * 5)، وليس (3 + 4) * 5، لأن * لديه أسبقية أعلى من +. بيان عودة في المثال الأصلي له الأسبقية منخفضة جدا. جميع المشغلين مثل +، - يتم تقييم، <،> = قبل أن

والتعبير بأكمله

Math.abs(y) <= EPSILON

وينبغي تقييم أولا، مما يعني أن وظيفة هو الذهاب لإرجاع قيمة منطقية (صح / خطأ). أما وقد قلت ذلك، إن

x != 0

وبعد ذلك أنا لست متأكدا ما سيحصل عاد.

وأنت على حق أنه فحص إذا كان المتغير x يساوي (حسنا، ربما الباحث) 0. ومع ذلك، إذا كان هذا صحيحا فإنه لا إرجاع القيمة المطلقة لذ، تقوم بإرجاع منطقية، و نتيجة ل<= المشغل.

وانها لإرجاع قيمة منطقية.

وابسيلون هو ضعف، وعقد قيمة 1E-14.

وهذا هو البيان IF الفعلي

if (x==0) {
    return MATH.abs(y) <= EPSILON;
}

وهكذا، ما يحصل إرجاعها إذا كانت القيمة المطلقة ذ أقل من أو يساوي ابسيلون.

وأنا لم تفعل جافا منذ فترة طويلة ولكن يبدو أن هذا هو في الواقع يعود منطقي (والتي يمكن أن يلقي ضمنا).

وأود أن أقول أن إذا كان x يساوي 0، فإنها ترجع صحيحا عندما تكون القيمة المطلقة ذ <= ابسيلون، وإلا فإنها ترجع كاذبة.

ولكن إذا كان x لا يساوي 0 ثم فإنه سيعود لاغية، كما يغطي أي بيان آخر.

وو"القضية" هي أن هذا جزء يعتمد heavyly على أسبقية المعامل (ليس سيئا في حد ذاته، ولكن أحيانا يمكن أن يكون مربكا).

هنا الذي يمكن العثور على قائمة جميع المشغلين جافا مع أولويتها، و هنا للمقارنة طاولة واحدة لC / C ++

وهو ما يعادل هذا

return (Math.abs(y) <= EPSILON);

والتي كان ينبغي أن تضاف إلى رمز للوضوح. كما ذكر، فإنه يعود منطقي.

ومن شأن البدائل يكون

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top