يتم إعطاؤك مقتطف تعليمات برمجية يحتوي على وظيفتين مساعدتين: `RoundSolution` و`EqualsNearly`.

تأخذ الدالة RoundSolution معلمتين: دالة `f` ودالة `x` مزدوجة. تتحقق أولاً مما إذا كانت `f(x)` تساوي 0. إذا كانت كذلك، تقوم الدالة بإرجاع `x` كما هي. بخلاف ذلك، يتم تقريب `x` إلى 12 منزلة عشرية باستخدام أسلوب `Math.Round` وتعيين القيمة المقربة إلى `r`. وأخيرًا، إذا كانت `f(r)` تساوي 0، فإنها تُرجع `r`؛ وإلا فإنها ترجع `x`.

يتم تعريف طريقة التمديد `EqualsNearly` للزوجي. يستغرق الأمر معلمتين: `x` و`y`، ومعلمة اختيارية `digits` بقيمة افتراضية تبلغ 12. تتحقق الطريقة مما إذا كان الفرق بين `x` و`y` مقربًا إلى المنازل العشرية `الأرقام`، يساوي 0.

مهمتك هي تنفيذ دالة `FindRoot` التي تعثر على جذر دالة معينة ضمن نطاق محدد. يجب أن تأخذ الدالة ثلاث معلمات: دالة `f` (مع توقيع `double f(double x)`)، ومزدوجين `lower` و`upper` يمثلان الحدود الدنيا والعليا للنطاق للبحث عن الجذر .

يجب أن تقوم وظيفتك بإرجاع الجذر (مقربًا إلى 12 منزلة عشرية) إذا كان موجودًا ضمن النطاق المحدد. في حالة عدم وجود جذر، يجب أن ترجع الدالة `null`.

استخدم الدالتين `RoundSolution` و`EqualsNearly` من مقتطف الشفرة لمساعدتك في تنفيذ الحل الخاص بك.

توقيع الوظيفة: `مزدوج ثابت عام؟ FindRoot(Func<double, double> f, double Lower, double Upper)`

**قيود:**
- النطاق المحدد بواسطة `السفلى` و`العلوي` شامل (أي أن كلا من `السفلي` و`العلوي` حلان صالحان).
- الدالة `f` متصلة ضمن النطاق المحدد بواسطة `السفلي` و`العلوي`.
- النطاق المحدد بواسطة `السفلى` و`العلوي` لن يحتوي على أكثر من جذر واحد.
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}