alienhana
alienhana

Reputation: 45

Problem with getting calculations of an array inside of an array done right

Using the formula in the pic, I need to write a program that allows the user to calculate sin(x), cos(x), tan(x). The user should enter the angle in degrees, and then the program should transform it into radians before performing the three requested calculations. For each requested calculation (i.e., sin(x), cos(x), tan(x)), I only need to calculate the first 15 terms of the series.

The problem seems to be in the arrays of the last block in the code, it keeps returning wrong results of the tan(x) series; how can I fix it?

enter image description here

#include <iostream>
 using namespace std;

//create a function to convert angles from degrees to radian
  double convertToRadian(double deg)
{     //formula : radian = (degree * pi)/180
   const double pi = 3.14159265359; //declaring pi's value as a constant
   return (deg * (pi / 180)); //returning the radian value
}

//create a function to calculate the exponent/power
double power(double base, unsigned int exp)
{
   double result = 1;
   for(int i = 0; i < exp; i++){
    result = result * base;
 }
 return result;
 }

 //create a function to get the factorial of a value 
 double factorial(int fac)
 {
   if(fac > 1)
      return fac * factorial(fac - 1);
    else
    return 1;
    }

   //create a function to print out arrays as we will use it to print the terms in the series
      void printTerms(double terms[15])
       { for (int i = 0; i < 15; i++)
         {
           cout<<terms[i]<<endl;
          }
          }


     int main()
       {
           double degree; //declare the variables used in the program
          double valueOfCos, valueOfSin, valueOfTan;  //declare variables for terms of each function
            cout << "Enter angle (x) in degrees: " << endl; //prompt for user to enter angle in deg
            cin >> degree;
               double radian = convertToRadian(degree); //first, converting from degrees to radian

         //make an array for the first 15 terms of cos(x):
         double cos[15];
        //make a loop to insert values in the array
        for (int n = 0; n < 15; n++)
       { //type the maclaurin series formula for cos(x):
        valueOfCos = (( power(-1 , n)) / (factorial(2*n))) * (power(radian, (2*n)));
          cos[n] = valueOfCos;
        }
           //print out the first 15 terms of cos(x) in the maclaurin series:
          cout << "cos(x)= ";
           printTerms (cos);

          //make an array for the first 15 terms of sin(x):
            double sin[15];
           for (int n = 0; n < 15; n++)
           {
             valueOfSin = ((power(-1 , n)) / (factorial((2*n + 1)))) * (power(radian, (2*n + 1)));
             sin[n] = valueOfSin;
            }
              cout << "sin(x)= ";
              printTerms (sin);

              double tan[15];
                for (int n = 0; n < 15; n++)
                     {   double bernoulli[15] = {(1/6), (-1/30),(1/42), (-1/30), (5/66), (-691/2730), 
              (7/6), (-3617/510), (43867/798), (-174611/330), (854513/138), (-236364091/2730), 
             (8553103/6),(-23749461029/870),(8615841276005/14322) };
        for (int i = 0; i < 15; i++)
    {
        double firstNum = 0, secondNum = 0 , thirdNum = 0 , denominator = 0;
        firstNum = power(-1 , n);
        secondNum = power(2 , 2*n + 2);
        thirdNum = ((secondNum) - 1);
        denominator = factorial(2*n + 2);
        valueOfTan = ((firstNum * secondNum * thirdNum * (bernoulli[i])) / denominator) * 
               (power(radian, 2*n + 1));
           tan [n] = valueOfTan;
        }
    }
     cout << "tan(x)= ";
     printTerms (tan);
 
         return 0;
        }

Upvotes: 1

Views: 257

Answers (2)

Pratap Alok Raj
Pratap Alok Raj

Reputation: 1206

You are incorrectly calculating the tan value.

In valueOfTan = ((firstNum * secondNum * thirdNum * (bernoulli[i])) / denominator) * (power(radian, 2 * n + 1));

Instead of bernoulli[i], you need to have bernoulli[2*i+2] as per the formulae.

And one more suggestion please pull the double bernoulli[15] = {(1/6), (-1/30),(1/42), (-1/30), (5/66), (-691/2730), (7/6), (-3617/510), (43867/798), (-174611/330), (854513/138), (-236364091/2730), (8553103/6),(-23749461029/870),(8615841276005/14322) array initialization out of the for loop, as it's constant you don't need to initialize it every time unnecessarily. It will increase your code runtime

Upvotes: 0

Yeshwanth N
Yeshwanth N

Reputation: 570

This loop : for (int n = 0; n < 15; n++) is not running or entire expression. You'll need to correct something like this :

double bernoulli[15] = {(1/6), (-1/30),(1/42), (-1/30), (5/66), (-691/2730),(7/6), (-3617/510), (43867/798), (-174611/330), (854513/138), (-236364091/2730),(8553103/6),(-23749461029/870),(8615841276005/14322) };
for (int n = 0; n < 15; n++){
 double firstNum = 0, secondNum = 0 , thirdNum = 0 , denominator = 0;
 firstNum = power(-1 , n);
 secondNum = power(2 , 2*n + 2);
 thirdNum = ((secondNum) - 1);
 denominator = factorial(2*n + 2);
 valueOfTan = ((firstNum * secondNum * thirdNum * (bernoulli[n])) / denominator) * (power(radian, 2*n + 1));
               tan [n] = valueOfTan;
            }
    }

Upvotes: 2

Related Questions