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

Recommended Answers

All 4 Replies

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.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.