C# Calculations

Здраствуйте, только изучаю C# и выполняю арифметическое задание. (вот мой вариант решения)

/// <summary>
        /// Calculate the following sum
        /// 1/(1*2) - 1/(2*3) + 1/(3*4) + ... + (-1)^(n+1) / (n * (n + 1)), where n > 0.
        /// </summary>
        /// <param name="n">Number of elements.</param>
        /// <returns>Sum of elements.</returns>
        public static double GetSumTwo(int n)
        {
            double result = 0;

            while (n != 0)
            {
                double first = Math.Pow(-1, n);
                double second = n * (n + 1);
                result = first / second;
                n -= 1;
            }
            return result;
        }

Но при выполнений тестов выходит ошибка, результат приблизительно равны, но отличаются на одну две цифры. Как можно сделать чтоб ответ был более корректным, плюс как можно возводить в степень без использования метода Math.Pow()

Expected: 0.38217893217893217d +/- 4.9406564584124654E-324d
But was:  0.39126984126984127d

Ответы (1 шт):

Автор решения: CrazyElf

Вы явно проверяете решение на другом коде (в данном коде не считается сумма) и для другого n. Я ради интереса посчитал на Питоне, вы считаете всё правильно, но для n=9, а не n=10, для которого вы привели ответ, на который нужно ориентироваться.

А насчёт степени, если считать нормальным образом - с первого члена ряда, а не с последнего, то можно просто завести переменную sign, записать в неё 1 в начале, а потом на каждом шаге цикла делать sign = -sign. И никакая степень не нужна. Всё, что нам нужно - это менять знак слагаемого и это делается вот таким способом.

И цикл while тут явно не нужен вообще, используйте for, ведь у вас точно известно, какие значения переменной цикла нужно перебрать. Так будет проще.

→ Ссылка