محاولة حساب PI إلى عدد الكسور العشرية مع C #

StackOverflow https://stackoverflow.com/questions/2226234

  •  19-09-2019
  •  | 
  •  

سؤال

ملاحظة: لقد قرأت بالفعل هذا الموضوع, ، لكنني لا أفهمها ولا تقدم حلا يمكنني استخدامه. أنا فظيع مع مشاكل الأرقام.

ما هي طريقة بسيطة لتوليد PI إلى عدد العشرية التي يريد المستخدم؟ هذا ليس للواجب المنزلي، فقط محاولة إكمال بعض المشاريع المدرجة هنا:

وصلة

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

المحلول

خوارزمية كلاسيكية لحساب أرقام pi هي خوارزمية غاوس - ليجيندر. في حين أنها ليست سريعة مثل بعض الخوارزميات الحديثة التي لديها ميزة أن تكون مفهومة.

يترك

a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1

ثم

a_(n+1) = (a_n + b_n) / 2
b_(n+1) = Sqrt(a_n * b_n)
t_(n+1) = t_n - p_n * (a_n - a_(n+1))^2
p_(n+1) = 2 * p_n

ثم

pi =. (a_n + b_n)^2 / (4 * t_n)

هنا (=. يعني "تساوي تقريبا") هذه الخوارزمية تعرض التقارب التربيعي (عدد الأماكن العشرية الصحيحة تتضاعف مع كل تكرار).

سأترك الأمر لك لترجمة هذا إلى ج # بما في ذلك اكتشاف مكتبة حسابية تعسفية الدقة.

نصائح أخرى

الموضوع الذي تتحدث عنه احسب قيمة PI باستخدام سلسلة Taylor. باستخدام وظيفة "Double F (int I)"، كتبك على هذا الموضوع، سيمنحك قيمة PI بعد مصطلحات "I".

هذه الطريقة لحساب PI هي نوع من البطيء، أقترح عليك أن تنظر إلى خوارزمية بي الثانية.

يمكنك أيضا العثور على تطبيق واحد هنا التي تحصل على حساب PI إلى رقم N TH.

حظ سعيد!

إذا كنت تأخذ نظرة فاحصة على هذا الدليل الجيد حقا:

أنماط البرمجة المتوازية: فهم وتطبيق أنماط متوازية مع .NET Framework 4

ستجد في الصفحة 70 هذا التطبيق لطيف (مع تغييرات طفيفة من جانبي):

static decimal ParallelPartitionerPi(int steps)
{
    decimal sum = 0.0;
    decimal step = 1.0 / (decimal)steps;
    object obj = new object();
    Parallel.ForEach(Partitioner.Create(0, steps),
        () => 0.0,
        (range, state, partial) =>
            {
                for (int i = range.Item1; i < range.Item2; i++)
            {
                decimal x = (i + 0.5) * step;
                partial += 4.0 / (1.0 + x * x);
            }
            return partial;
        },
        partial => { lock (obj) sum += partial; });
    return step * sum;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top