Вычисление функции sin с использованием факториальных рядов в C

#c #nested-loops

#c #вложенные циклы

Вопрос:

Я пытался вычислить значение sin пользовательского ввода, используя факториалы (ряды), но всякий раз, когда я ввожу какое-либо значение, я получаю «-nan (ind)» в качестве вывода, вот мой код:

 #include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
int N, i, j, fact = 1, sign = 1;
    float x, y = 0;
    cout << "Enter N (number of iterations),x (angle value in rad): ";
    cin >> N >> x;
    for (i = 1;i <= N;i  ) {
        fact = 1;
        for (j = 1;j <= i;j  ) {
            fact *= j;
        }
        y  = sign * (pow(x, 2 * i - 1)) / fact;
        sign *= -1;
    }
    cout << "sin(" << x << ") = " << y << " the real value should be " << sin(x);
}
 

Комментарии:

1. Я получил вывод Enter N (number of iterations),x (angle value in rad): sin(0.5) = 0.442398 the real value should be 0.479426 для ввода 10 0.5 .

2. Не уверен, почему у вас есть вложенный цикл для вычисления факториала. Разве вы не можете просто сохранить текущее значение fact вместо того, чтобы сбрасывать его 1 каждый раз?

3. Также обратите внимание, что int он используется для факториала, поэтому он вызовет переполнение, если N будет слишком большим.

4. Где «слишком большой» может быть немного меньше, чем вы ожидаете. Например, в моей системе 13! этого достаточно. В некоторых системах N = 8 этого было бы достаточно, чтобы вызвать проблемы.

5. Факториал любого значения 13 или более будет переполнять 32-разрядный int , вызывая неопределенное поведение. Если ваш компилятор поддерживает 64-разрядную int версию (относительно редко), то переполнение и неопределенное поведение происходят для 20 или более. В любом случае, термины в ряду Тейлора для sin() имеют вид x^n/n! (используется ^ для обозначения «в степени»), который, даже для умеренно большого x , включает вычисление и деление двух больших значений. Ищите альтернативные стратегии, такие как использование взаимосвязи между последовательными членами в ряду, чтобы избежать явного вычисления и деления таких больших значений