Need to figure out what is going wrong with my source code. When I imput the values of 72, 69, and 2.8 respectively I should output pdf=0.85801, however I am not getting that value. I don't know why. I am doing the adaptive simpsons method to find the probability density of data under a normal curve. I believe that I might have the "approx" in the wrong spot, or I'm not calling my functions correctly. This like will take you to a PDF of what I am trying to do, I'm totally lost at this point.
http://ezekiel.vancouver.wsu.edu/~cs251/projects/pdf/pdf.pdf

``````#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double INV_SQRT_2PI= 0.39894228;						/*1/sqrt(2*pi)*/
double a, b, u, U, O, c, left, right, d, approx, x;
double epsilon= 0.0000001;								/*epsilon defined as 0.0000001*/
double f(double x);										/*prototype functions*/
double S(double a, double b);
double asimpson(double a, double b, double approx, double epsilon);

int main(void)
{
printf("Enter x Value: ");
scanf("%lf", &x);
printf("Enter Mean: ");
scanf("%lf", &U);
printf("Enter Standard Deviation: ");
scanf("%lf", &O);
double pdf, u;
u=((x-U)/O);
pdf=((1/2)+INV_SQRT_2PI * asimpson(0,u,S(0,u),epsilon));

printf("pdf= %f",pdf);

return 0;
}
double f(double x)
{
return (exp(double(x*x*(-1))/2));
}
double S(double a,double b)
{
return ((b-a)/6)*(f(a)+(4*f((a+b)/2))+f(b));
}
double asimpson(double a,double b,double approx, double epsilon)
{
approx= S(a,b);
c=((a+b)/2);
left=S(a,c);
right=S(c,b);
d=((left+right-approx)/15);
if(abs(d)<=epsilon)
return (left+right+d);
return (asimpson(a,c,left,epsilon/2)+asimpson(c,b,right,epsilon/2));
}``````

Thanks

4
Contributors
4
Replies
5
Views
10 Years
Discussion Span
Last Post by jonbuckets

Looks like it is a precision problem.

This is actually one of the most insidious problems people learning C/C++ get.

The problem is one of type.

1/2 is integer
1/2.0 is floating point

So, for example, when you go to calculate the PDF you say `pdf=((1/2)+INV_SQRT_2PI * ...` That one-half there is an integer expression, which gets promoted to double after it is evaluated. Hence, 1 idiv 2 is 0, promoted to double is 0.0, + INV_SQRT_2PI etc..

All the places where you have something like `/2` check to make sure your numerator is a double before division occurs. If it isn't, change your denominator to a double (say, `/2.0` ).

Hope this helps.

All the places where you have something like `/2` check to make sure your numerator is a double before division occurs. If it isn't, change your denominator to a double (say, `/2.0` ).

Or, more generally, make sure at least one of the values being divided is a floating point value.

Thanks for the help, that was exactly what was wrong. That was a pain in the ass... I wont forget the way that works anytime soon. Thanks alot everyone! This thread can be removed/deleted/whatever now.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.