سؤال

أنا في منتصف قم بتنفيذ بعض الكود C ++ إلى Java، وأستمر في الجري عبر الحالات التي كتب فيها كل من كتبه في القيام بما يلي:

double c = (1.0/(a+1.0)*pow(b, a+1.0));
double d = (1./(integral(gamma, dmax)-integral(gamma, dmin)))*(integral(gamma+1, dmax)-integral(gamma+1, dmin));

بدلا من:

double c = pow(b, a+1.0)/(a+1.0);
double d = (integral(gamma+1, dmax)-integral(gamma+1, dmin))/(integral(gamma, dmax)-integral(gamma, dmin));

والثاني يبدو أكثر وضوحا، وما لم أكن مخطئا في ترتيب العمليات في C ++ يجب أن يفعلوا نفس الشيء. هل هناك بعض الأسباب للقيام الأول وليس الثاني؟ الشيء الوحيد الذي يمكن أن أفكر فيه سيكون بعض القضية الغريبة مع الدقة.

هل كانت مفيدة؟

المحلول

نعم انهم نفس الشيء. السبب الوحيد الذي يمكنني التفكير فيه هو الوضوح الرياضي: في بعض الأحيان عندما تطبيع كمية، غالبا ما تكتب:

answer = (1/total) * (some of it)

على سبيل المثال، غالبا ما يتم كتابة نظرية Cauchy Integral

f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)

نصائح أخرى

إذا a لا يزال هو نفسه و b يتغير (قل، إذا كان الكود الخاص بك في حلقة ومن الواضح ذلك a لا يتغير بين اثنين من التكرار، على سبيل المثال لأنها const متغير)، ثم يمكن للإصدار الأصلي تنفيذ أسرع، لأن الضرب أرخص من التقسيم (على افتراض التحويل البرمجي على حساب حساب 1/... خارج الحلقة).

يبدو أن محاولة مضللة في التحسين إذا كان هذا هو السبب في ذلك، لكن هذا لا يعني أنه ليس كذلك.

أوه، وفيما يتعلق بدقة، فإن النسخة الأصلية هي في الواقع أقل دقة أقل قليلا من لك، إذا كان أي شيء، لأن هناك خطأ تقريب إضافي ل 1/.... وبعد هذا خطأ التقريب الذي يمنع المحول البرمجي من تحويل الإصدار الخاص بك إلى الإصدار الأصلي من Volition الخاص به: إنهم لا يحسبون بالضبط نفس الشيء (ولكن الأشياء المقريبة جدا).

نعم يجب أن يفعلوا نفس الشيء. قد يكون المؤلف الأصلي متماثل المعادلات وجدت آخر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top