Total circles area: Difference between revisions
Content added Content deleted
(reflow floating thumbnails) |
(Improved C entry (partially from Ledrug code)) |
||
Line 49:
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <stdbool.h>
typedef
typedef struct { Fp x, y, r; } Circle;
{ 1.6417233788, 1.6121789534, 0.0848270516},
{-1.4944608174, 1.2077959613, 1.1039549836},
Line 79 ⟶ 83:
{ 0.0152957411, 0.0638919221, 0.9771215985}};
double min(const double a, const double b) { return a <= b ? a : b; }▼
static inline Fp sq(const Fp a) { return a * a; }
// Return an uniform random value in [a, b).
const double r01 = rand() / (double)RAND_MAX;
return a + (b - a) * r01;
}
static inline bool is_inside_circles(const Fp x, const Fp y) {
for (size_t i = 0; i < n_circles; i++)
return false;
}
int main() {
// Initialize the bounding box (bbox) of the circles.▼
▲ const size_t n_circles = sizeof(circles) / sizeof(Circle);
Fp y_min = x_min, y_max = x_max;
▲ // Initialize the bounding box of the circles.
▲ double x_max = -1e100;
// Compute the bounding box of the circles.
for (size_t i = 0; i < n_circles; i++) {
x_min = min(x_min, c
x_max = max(x_max, c
y_min = min(y_min, c
y_max = max(y_max, c
c->r *= c->r; // Square the radii to speed up testing.
}
const Fp bbox_area = (x_max - x_min) * (y_max - y_min);
// Montecarlo sampling.
srand(
size_t n_tries = 0;
size_t n_hits = 0;
n_hits += is_inside_circles(uniform(x_min, x_max),
uniform(y_min, y_max));
n_tries++;
const
const
▲ if ((dx * dx + dy * dy) <= (circles[j].r * circles[j].r)) {
▲ hits++;
break;
}
}
return 0;
}</lang>
{{out}}
<pre>21.4498 +/- 0.0370 (65536 samples)
21.5031 +/- 0.0262 (131072 samples)
21.5170 +/- 0.0185 (262144 samples)
21.5442 +/- 0.0131 (524288 samples)
21.5477 +/- 0.0093 (1048576 samples)
21.5531 +/- 0.0065 (2097152 samples)
21.5624 +/- 0.0046 (4194304 samples)
21.5631 +/- 0.0033 (8388608 samples)
21.5602 +/- 0.0023 (16777216 samples)
21.5632 +/- 0.0016 (33554432 samples)
21.5617 +/- 0.0012 (67108864 samples)
21.5628 +/- 0.0008 (134217728 samples)
21.5639 +/- 0.0006 (268435456 samples)
21.5637 +/- 0.0004 (536870912 samples)
21.5637 +/- 0.0003 (1073741824 samples)</pre>
=={{header|D}}==
|