add numerical recipes library
This commit is contained in:
57
lib/nr/ansi/examples/xran.c
Normal file
57
lib/nr/ansi/examples/xran.c
Normal file
@@ -0,0 +1,57 @@
|
||||
|
||||
/* Driver for routines ran0, ran1, ran2, ran3 */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#define NRANSI
|
||||
#include "nr.h"
|
||||
|
||||
#define PI 3.1415926
|
||||
|
||||
static unsigned long twotoj[16]={0x1L,0x2L,0x4L,0x8L,0x10L,0x20L,0x40L,0x80L,
|
||||
0x100L,0x200L,0x400L,0x800L,0x1000L,0x2000L,0x4000L,0x8000L};
|
||||
|
||||
float fnc(float x1,float x2,float x3,float x4)
|
||||
{
|
||||
return (float) sqrt(x1*x1+x2*x2+x3*x3+x4*x4);
|
||||
}
|
||||
|
||||
void integ(float (*func)(long *))
|
||||
{
|
||||
long idum=(-1),iy[4],jpower,k;
|
||||
int i,j;
|
||||
float x1,x2,x3,x4,yprob[4];
|
||||
|
||||
/* Calculates pi statistically using volume of unit n-sphere */
|
||||
for (i=1;i<=3;i++) iy[i]=0;
|
||||
printf("volume of unit n-sphere, n = 2, 3, 4\n");
|
||||
printf("# points pi (4/3)*pi (1/2)*pi^2\n\n");
|
||||
for (j=1;j<=15;j++) {
|
||||
for (k=twotoj[j-1];k>=0;k--) {
|
||||
x1=(*func)(&idum);
|
||||
x2=(*func)(&idum);
|
||||
x3=(*func)(&idum);
|
||||
x4=(*func)(&idum);
|
||||
if (fnc(x1,x2,0.0,0.0) < 1.0) ++iy[1];
|
||||
if (fnc(x1,x2,x3,0.0) < 1.0) ++iy[2];
|
||||
if (fnc(x1,x2,x3,x4) < 1.0) ++iy[3];
|
||||
}
|
||||
jpower=twotoj[j];
|
||||
for (i=1;i<=3;i++)
|
||||
yprob[i]=(float) twotoj[i+1]*iy[i]/jpower;
|
||||
printf("%6ld %12.6f %12.6f %12.6f\n",
|
||||
jpower,yprob[1],yprob[2],yprob[3]);
|
||||
}
|
||||
printf("\nactual %12.6f %12.6f %12.6f\n",
|
||||
PI,4.0*PI/3.0,0.5*PI*PI);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
printf("\nTesting ran0:\n"); integ(ran0);
|
||||
printf("\nTesting ran1:\n"); integ(ran1);
|
||||
printf("\nTesting ran2:\n"); integ(ran2);
|
||||
printf("\nTesting ran3:\n"); integ(ran3);
|
||||
return 0;
|
||||
}
|
||||
#undef NRANSI
|
||||
Reference in New Issue
Block a user