58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
|
|
/* 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
|