Update
This commit is contained in:
parent
69211252dc
commit
7797711ca9
1 changed files with 61 additions and 0 deletions
61
exercises.md
Normal file
61
exercises.md
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# Exercises
|
||||||
|
|
||||||
|
Here let be listed exercises for the readers of this wiki. You can allow yourself to as many helpers and resources as you find challenging: with each problem you should either find out you know the solution or learn something new while solving it.
|
||||||
|
|
||||||
|
1. SOMETHING EASY SHOULD BE HERE SO THAT NUBS ARENT DISCOURAGED BY FIRST QUESTION xD
|
||||||
|
2. Write a program in [C](c.md) that computes the value of [pi](pi.md) without using float/double and any libraries except for `stdio.h` and `stdint.h` -- you can only use built-in integer types and those from `stdint.h`. The program must compute pi as accurately as possible (at least 2 decimals) and write the value out as base 10 decimal.
|
||||||
|
|
||||||
|
## Solutions
|
||||||
|
|
||||||
|
A solution to each problem should be listed here -- keep in mind there may exist other solutions that those listed here.
|
||||||
|
|
||||||
|
**solution 1**:
|
||||||
|
TODO
|
||||||
|
|
||||||
|
**solution 2**:
|
||||||
|
|
||||||
|
```
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define DECIMALS 10000
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int64_t previousError = 10000000000;
|
||||||
|
uint64_t previousPi = 0;
|
||||||
|
|
||||||
|
for (uint64_t gridSize = 2; gridSize < 200000; gridSize *= 2)
|
||||||
|
{
|
||||||
|
/* We'll sample a grid of points and count those that fall inside the
|
||||||
|
circle with radius of gridSize. Thanks to the 8-symmtery of a circle we
|
||||||
|
only sample the 1/8th of the plane. */
|
||||||
|
|
||||||
|
uint64_t inCircle = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < gridSize; ++y)
|
||||||
|
for (int x = y; x <= gridSize; ++x)
|
||||||
|
if ((x * x + y * y) / gridSize <= gridSize) // if distance is < radius
|
||||||
|
inCircle++; // count the point
|
||||||
|
|
||||||
|
// compute pi from the formula for circle area (area = 2 * pi * r):
|
||||||
|
uint64_t pi = (inCircle * 8 * DECIMALS) / (gridSize * gridSize);
|
||||||
|
|
||||||
|
int64_t error = pi - previousPi;
|
||||||
|
|
||||||
|
if (error < 0)
|
||||||
|
error *= -1;
|
||||||
|
|
||||||
|
if (error > previousError) // error got bigger due to overflows, stop
|
||||||
|
{
|
||||||
|
puts("that's it");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
previousError = error;
|
||||||
|
previousPi = pi;
|
||||||
|
|
||||||
|
printf("%d.%d\n",pi / DECIMALS,pi % DECIMALS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Loading…
Reference in a new issue