I can't seem to find the error. I need a fresh pair of eyes. I am trying to calculate the values of Cos/Sin/Tan of an angle in C++ without using built-in functions or libraries. These are the only requirements.
This is what I have gotten so far: I have written a function to calculate the exponential values, factorials and the required values.
I keep getting errors and I don't know where they originate from. Some numbers give me exactly the right answers and others are so far off. So could you tell me what I am doing wrong here?
#include <iostream>
#include <cmath>
using namespace std;
double bernoulli_numbers[] = { 1, -1/2.0, 1/6.0, -1/30.0, 5/66.0, -691/2730.0, 7/6.0, -3617/510.0, 43867/798.0, -174611/330.0, 854513/138.0};
int angleToRadian(int angle) {
float rad_angle;
rad_angle = angle * (M_PI / 180);
return rad_angle;
}
int calculatingExponents(int num, int power) {
long double result = 1;
for (int i = 0; i < power ; ++i) {
result *= num;
}
return result;
}
unsigned long long calculatingFactorials(int n) {
unsigned long long factorial = 1;
if ( n < 0 ) {
cout << "Can't compute factorials for negative numbers" << endl;
}
else if ( n < 2 ) {
return 1;
}
else {
for (int i = n; (i >= 2) ; i--) {
factorial = factorial * i;
}
}
return factorial;
}
void calculatingCos(double angle) {
long double numerator;
long double last_term;
unsigned long long denominator;
long double result;
long double final_result = 0;
for (int i = 0; i < 15; ++i) {
numerator = calculatingExponents(-1, i);
denominator = calculatingFactorials(2 * i);
last_term = calculatingExponents(angle, (2 * i));
result = (numerator / denominator) * last_term;
final_result += result;
}
cout << "The Cosine of the angle = " << final_result << endl;
}
void calculatingSin(double angle) {
long double numerator;
long double last_term;
unsigned long long denominator;
long double result;
long double final_result = 0;
for (int i = 0; i < 15; ++i) {
numerator = calculatingExponents(-1, i);
denominator = calculatingFactorials((2 * i) + 1);
last_term = calculatingExponents(angle, ((2 * i) + 1));
result = (numerator / denominator) * last_term;
final_result += result;
}
cout << "The Sine of the angle = " << final_result << endl;
}
void calculatingTan(double angle) {
int bernoulli_index;
long double bernoulli_number;
long double numerator;
long double last_term;
unsigned long long denominator;
long double result;
long double final_result = 0;
for (int i = 0; i < 15; ++i) {
bernoulli_index = (2 * i) + 2;
bernoulli_number = bernoulli_numbers[bernoulli_index];
numerator =
calculatingExponents(-1, i)
*
calculatingExponents(2, (2 * i) + 2)
*
( calculatingExponents(2, (((2 * i) + 2) * 1)) - 1) * bernoulli_number;
denominator = calculatingFactorials((2 * i) + 2);
last_term = calculatingExponents(angle, (2 * i) + 1);
result = (numerator / denominator) * last_term;
final_result += result;
}
cout << "The Tan of the angle = " << final_result << endl;
}
int main() {
int degree_angle;
int x;
cout << "Please input an angle in degrees:" << endl;
cin >> degree_angle;
x = angleToRadian(degree_angle);
calculatingCos(x);
calculatingSin(x);
calculatingTan(x);
}
Some the errors I am getting are:
Input: 180
Output:
The Cosine of the angle = -0.989992
The Sine of the angle = 0.14112
The Tan of the angle = 3.49908e+07
Expected Outputs:
The Cosine of the angle = -1
The Sine of the angle = 0
The Tan of the angle = 0
Input: 60
Output:
The Cosine of the angle = 0.540302
The Sine of the angle = 0.841471
The Tan of the angle = 1705.3
Expected Outputs:
The Cosine of the angle = 0.5
The Sine of the angle = 0.86602540378
The Tan of the angle = 1.73205080757
A lot of parameters and variables are
intwhen they only make sense as doubles.angleToRadianpreviously returned anint, there are pi radians in a circle so angles under 360 degrees are going to snap to 0, 1, 2 or 3 radians. You need to return a decimal to get a correct conversion.The
numparameter incalculatingExponentstakes the decimal angle as a result ofangleToRadians, sonum,resultand the return type ofcalculatingExponentsall need to be floating point numbers too.If you're using an
unsigned long longbut returning anint, you're relying on implementation defined behaviour, so have no guarantees of a reasonable answer.Again
angleToRadianreturns a floating point number, soxneeds to be a floating point type.These modifications seems to correct sine and cosine between -90 and 90 degrees.
I'm not yet sure what mistake is happening in the tangent calculation.