So here is the problem question that I was presented with:
![Posted Image]()
The only non-standard code I used was the one to clear the screen. But I have a major question here. This is the first time I am writing anything that requires precise data for computation. Here goes the code:
I wrote the code trying to be as standard compliant (with all warnings from compiler turned on) gave no errors or warnings:
Although my instructor said my results were acceptable for the values he needed it for (0.5, 0.6 etc), I am pretty sure that I am quite confused with floating point comparison. I know we cannot compare floating point 0.0 values so what I did was a range check. Is there any more precise method to achieve this in C? Also I am a bit confused with the (x.y)f terminology. How exactly does C round off/truncate the digits? Is the x the total number of digits and y the number of digits after the radix point? I really need a thorough understanding of the floating point arithmetic as handled in C.
Edit: I read something about using an epsilon to compare floats/doubles. What does that mean? Thanks.
Thank You very much much for any improvement suggestions, resource links etc.

The only non-standard code I used was the one to clear the screen. But I have a major question here. This is the first time I am writing anything that requires precise data for computation. Here goes the code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double factorial(double);
int checkdiff(double, double);
int main()
{
printf("5th Decimal Sin(x) Accuracy\n");
int m, flag=0;
double n, x=0.0, val=0.0, factVal, powVal, sinValue;
printf("Please input a floating point number: ");
scanf("%lf", &x);
printf("Input Specified: %lf\n", x);
sinValue=sin(x);
printf("Sine Value = %lf\n\n", sinValue);
/*
sin(x)=x-x^3/3!+x^5/5!-x^7/7!+... (with x in radians)
looping to forrm sin(x) equation of nth term= x^n/n!, +- alternately
*/
for(n = 1.0, m = 2; ; n+=2.0, m++)
{
powVal=pow(x, n);
factVal=factorial(n);
if((m%2)==0)
{
val+=powVal/(factVal);
printf("{\nFactorial Value is:%lf\nPower Value = %lf\nValue in +ve field = %lf\n}\n", factVal, powVal, val);
flag = checkdiff(sinValue, val);
if(flag == 1)
{
break;
}
else
{
continue;
}
}
else
{
val-=powVal/(factVal);
printf("{\nFactorial Value is:%lf\nPower Value = %lf\nValue in -ve field = %lf\n}\n", factVal, powVal, val);
flag=checkdiff(sinValue, val);
if(flag == 1)
{
break;
}
else
{
continue;
}
}
}
return 0;
}
double factorial(double n)
{
int retval = 1, i;
for (i = n; i > 1; --i)
retval *= i;
return retval;
}
int checkdiff(double sinValue, double val)
{
double newVal=sinValue-val;
printf("Difference of Sine Value = %lf and value = %lf is %lf\n", sinValue, val, newVal);
if((newVal>=-0.000009 && newVal <= -0.000001) || (newVal>=0.000001 && newVal <= 0.000009))
{
// system("cls"); -> Non-Standard Function, but overlooking SE/OS issues.
printf("%.5lf is the required solution", val);
return 1;
} // we know sin(x) lies between -1 to 1
return -1;
}
I wrote the code trying to be as standard compliant (with all warnings from compiler turned on) gave no errors or warnings:
mingw32-gcc.exe -Wall -g -Wall -c "C:\####\Code\C-Code\Fifth-Decimal-Sin(x)-Accuracy\main.c" -o obj\Debug\main.o Process terminated with status 0 (0 minutes, 0 seconds) 0 errors, 0 warnings (0 minutes, 0 seconds)
Although my instructor said my results were acceptable for the values he needed it for (0.5, 0.6 etc), I am pretty sure that I am quite confused with floating point comparison. I know we cannot compare floating point 0.0 values so what I did was a range check. Is there any more precise method to achieve this in C? Also I am a bit confused with the (x.y)f terminology. How exactly does C round off/truncate the digits? Is the x the total number of digits and y the number of digits after the radix point? I really need a thorough understanding of the floating point arithmetic as handled in C.
Edit: I read something about using an epsilon to compare floats/doubles. What does that mean? Thanks.
Thank You very much much for any improvement suggestions, resource links etc.