Statistiques
| Révision :

root / Pi / C / Simple / Pi_Simple.c @ 246

Historique | Voir | Annoter | Télécharger (4,37 ko)

1 154 equemene
//
2 154 equemene
// Estimation of Pi using Monte Carlo exploration process
3 154 equemene
// Cecill v2 Emmanuel QUEMENER <emmanuel.quemener@gmail.com>
4 154 equemene
// gcc -O3 -o Pi_Simple Pi_Simple.c -lm
5 154 equemene
//
6 154 equemene
7 154 equemene
#include <math.h>
8 154 equemene
#include <stdio.h>
9 154 equemene
#include <stdlib.h>
10 154 equemene
#include <limits.h>
11 196 equemene
#include <sys/time.h>
12 154 equemene
13 154 equemene
// Marsaglia RNG very simple implementation
14 154 equemene
#define znew  ((z=36969*(z&65535)+(z>>16))<<16)
15 154 equemene
#define wnew  ((w=18000*(w&65535)+(w>>16))&65535)
16 154 equemene
#define MWC   (znew+wnew)
17 154 equemene
#define SHR3  (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5))
18 154 equemene
#define CONG  (jcong=69069*jcong+1234567)
19 154 equemene
#define KISS  ((MWC^CONG)+SHR3)
20 154 equemene
21 196 equemene
#define MWCfp MWC*2.328306435454494e-10f
22 196 equemene
#define KISSfp KISS*2.328306435454494e-10f
23 196 equemene
#define SHR3fp SHR3*2.328306435454494e-10f
24 196 equemene
#define CONGfp CONG*2.328306435454494e-10f
25 154 equemene
26 154 equemene
#define ITERATIONS 1000000000
27 154 equemene
28 154 equemene
#ifdef LONG
29 154 equemene
#define LENGTH long long
30 154 equemene
#else
31 154 equemene
#define LENGTH int
32 154 equemene
#endif
33 154 equemene
34 154 equemene
LENGTH MainLoopGlobal(LENGTH iterations,unsigned int seed_w,unsigned int seed_z)
35 154 equemene
{
36 154 equemene
#if defined TCONG
37 154 equemene
   unsigned int jcong=seed_z;
38 154 equemene
#elif defined TSHR3
39 154 equemene
   unsigned int jsr=seed_w;
40 154 equemene
#elif defined TMWC
41 154 equemene
   unsigned int z=seed_z;
42 154 equemene
   unsigned int w=seed_w;
43 154 equemene
#elif defined TKISS
44 154 equemene
   unsigned int jcong=seed_z;
45 154 equemene
   unsigned int jsr=seed_w;
46 154 equemene
   unsigned int z=seed_z;
47 154 equemene
   unsigned int w=seed_w;
48 154 equemene
#endif
49 154 equemene
50 154 equemene
   LENGTH total=0,i;
51 154 equemene
   unsigned long inside;
52 154 equemene
53 154 equemene
   for (i=0;i<iterations;i++) {
54 154 equemene
55 154 equemene
#if defined TINT32
56 154 equemene
    #define THEONE 1073741824
57 154 equemene
    #if defined TCONG
58 154 equemene
        unsigned int x=CONG>>17 ;
59 154 equemene
        unsigned int y=CONG>>17 ;
60 154 equemene
    #elif defined TSHR3
61 154 equemene
        unsigned int x=SHR3>>17 ;
62 154 equemene
        unsigned int y=SHR3>>17 ;
63 154 equemene
    #elif defined TMWC
64 154 equemene
        unsigned int x=MWC>>17 ;
65 154 equemene
        unsigned int y=MWC>>17 ;
66 154 equemene
    #elif defined TKISS
67 154 equemene
        unsigned int x=KISS>>17 ;
68 154 equemene
        unsigned int y=KISS>>17 ;
69 154 equemene
    #endif
70 154 equemene
#elif defined TINT64
71 154 equemene
    #define THEONE 4611686018427387904
72 154 equemene
    #if defined TCONG
73 154 equemene
        unsigned long x=(unsigned long)(CONG>>1) ;
74 154 equemene
        unsigned long y=(unsigned long)(CONG>>1) ;
75 154 equemene
    #elif defined TSHR3
76 154 equemene
        unsigned long x=(unsigned long)(SHR3>>1) ;
77 154 equemene
        unsigned long y=(unsigned long)(SHR3>>1) ;
78 154 equemene
    #elif defined TMWC
79 154 equemene
        unsigned long x=(unsigned long)(MWC>>1) ;
80 154 equemene
        unsigned long y=(unsigned long)(MWC>>1) ;
81 154 equemene
    #elif defined TKISS
82 154 equemene
        unsigned long x=(unsigned long)(KISS>>1) ;
83 154 equemene
        unsigned long y=(unsigned long)(KISS>>1) ;
84 154 equemene
    #endif
85 154 equemene
#elif defined TFP32
86 159 equemene
#define THEONE (float)1.0f
87 154 equemene
    #if defined TCONG
88 154 equemene
        float x=CONGfp ;
89 154 equemene
        float y=CONGfp ;
90 154 equemene
    #elif defined TSHR3
91 154 equemene
        float x=SHR3fp ;
92 154 equemene
        float y=SHR3fp ;
93 154 equemene
    #elif defined TMWC
94 154 equemene
        float x=MWCfp ;
95 154 equemene
        float y=MWCfp ;
96 154 equemene
    #elif defined TKISS
97 154 equemene
      float x=KISSfp ;
98 154 equemene
      float y=KISSfp ;
99 154 equemene
    #endif
100 154 equemene
#elif defined TFP64
101 159 equemene
#define THEONE (double)1.0f
102 154 equemene
    #if defined TCONG
103 154 equemene
        double x=(double)CONGfp ;
104 154 equemene
        double y=(double)CONGfp ;
105 154 equemene
    #elif defined TSHR3
106 154 equemene
        double x=(double)SHR3fp ;
107 154 equemene
        double y=(double)SHR3fp ;
108 154 equemene
    #elif defined TMWC
109 154 equemene
        double x=(double)MWCfp ;
110 154 equemene
        double y=(double)MWCfp ;
111 154 equemene
    #elif defined TKISS
112 154 equemene
        double x=(double)KISSfp ;
113 154 equemene
        double y=(double)KISSfp ;
114 154 equemene
    #endif
115 154 equemene
#endif
116 154 equemene
117 154 equemene
      inside=((x*x+y*y) < THEONE) ? 1:0;
118 154 equemene
      total+=inside;
119 154 equemene
   }
120 154 equemene
121 154 equemene
   return(total);
122 154 equemene
}
123 154 equemene
124 154 equemene
int main(int argc, char *argv[]) {
125 154 equemene
126 159 equemene
  unsigned int seed_w=110271,seed_z=101008;
127 154 equemene
  LENGTH iterations=ITERATIONS,inside=0;
128 196 equemene
  struct timeval tv1,tv2;
129 196 equemene
  struct timezone tz;
130 196 equemene
131 154 equemene
  if (argc > 1) {
132 154 equemene
    iterations=(LENGTH)atoll(argv[1]);
133 154 equemene
  }
134 154 equemene
  else {
135 154 equemene
    printf("\n\tPi : Estimate Pi with Monte Carlo exploration\n\n");
136 154 equemene
    printf("\t\t#1 : number of iterations (default 1 billion)\n");
137 154 equemene
  }
138 154 equemene
139 154 equemene
  printf ("\n\tInformation about architecture:\n\n");
140 154 equemene
141 154 equemene
  printf ("\tSizeof int = %lld bytes.\n", (long long)sizeof(int));
142 154 equemene
  printf ("\tSizeof long = %lld bytes.\n", (long long)sizeof(long));
143 154 equemene
  printf ("\tSizeof long long = %lld bytes.\n\n", (long long)sizeof(long long));
144 154 equemene
145 154 equemene
  printf ("\tMax int = %u\n", INT_MAX);
146 154 equemene
  printf ("\tMax long = %ld\n", LONG_MAX);
147 154 equemene
  printf ("\tMax long long = %lld\n\n", LLONG_MAX);
148 154 equemene
149 196 equemene
  // Set start timer
150 196 equemene
  gettimeofday(&tv1, &tz);
151 196 equemene
152 154 equemene
  inside=MainLoopGlobal(iterations,seed_w,seed_z);
153 196 equemene
154 196 equemene
  // Set stop timer
155 196 equemene
  gettimeofday(&tv2, &tz);
156 154 equemene
157 196 equemene
  double elapsed=(double)((tv2.tv_sec-tv1.tv_sec) * 1000000L +
158 196 equemene
                          (tv2.tv_usec-tv1.tv_usec))/1000000;
159 196 equemene
160 196 equemene
  double itops=(double)(iterations)/elapsed;
161 196 equemene
162 246 equemene
  printf("Inside/Total %lld %lld\nElapsed Time %.2f\nItops %.0f\nPi estimation %f\n\n",inside,iterations,elapsed,itops,(4.*(float)inside/(float)(iterations)));
163 154 equemene
164 196 equemene
  printf("\n\n");
165 196 equemene
166 196 equemene
  return 0;
167 154 equemene
168 154 equemene
}