#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
, включает вычисление и деление двух больших значений. Ищите альтернативные стратегии, такие как использование взаимосвязи между последовательными членами в ряду, чтобы избежать явного вычисления и деления таких больших значений