analistica/ex-2/naive.c

57 lines
1.2 KiB
C
Raw Normal View History

2020-03-06 02:24:32 +01:00
#include <stdio.h>
#include <math.h>
/* Naive approach using the definition
* of γ as the difference between log(n)
* and the Rieman sum of its derivative (1/n).
*
* The result is:
*
* approx: 0.57721 56648 77325
* true: 0.57721 56649 01533
* diff: 0.00000 00000 24207
*
* The convergence is logarithmic and so
* slow that the double precision runs out
* at the 10th decimal digit.
*
*/
double exact = 0.577215664901532860;
double partial_sum(size_t n) {
double sum = 0;
for (double k = 1; k <= n; k++) {
sum += 1/k;
}
return sum - log(n);
}
int main () {
size_t prev_n, n = 2;
double prev_diff, diff=1;
double approx;
/* Compute the approximation
* and the difference from the true value.
* Stop when the difference starts increasing
* due to roundoff errors.
*
*/
do {
prev_n = n;
n *= 10;
prev_diff = diff;
approx = partial_sum(n);
diff = fabs(exact - approx);
printf("n:\t%.0e\t", (double)n);
printf("diff:\t%e\n", diff);
} while (diff < prev_diff);
printf("n:\t%.0e\n", (double)prev_n);
printf("approx:\t%.15f\n", approx);
printf("true:\t%.15f\n", exact);
printf("diff:\t%.15f\n", prev_diff);
printf("\t 123456789_12345\n");
}