954,206 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Need Help Fast!!!

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

jonbuckets
Newbie Poster
2 posts since Oct 2007
Reputation Points: 10
Solved Threads: 0
 

Looks like it is a precision problem.

ithelp
Nearly a Posting Maven
Banned
2,230 posts since May 2006
Reputation Points: 769
Solved Threads: 128
 

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 aninteger 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 doublebefore division occurs. If it isn't, change your denominator to a double (say, /2.0 ).

Hope this helps.

Duoas
Postaholic
2,043 posts since Oct 2007
Reputation Points: 1,140
Solved Threads: 229
 
All the places where you have something like /2 check to make sure your numerator is a doublebefore 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.

WaltP
Posting Sage w/ dash of thyme
Moderator
10,492 posts since May 2006
Reputation Points: 3,348
Solved Threads: 943
 

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.

jonbuckets
Newbie Poster
2 posts since Oct 2007
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You