Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- struct result_t {
- int n;
- long double value, absolute_error, remainder_term;
- };
- result_t func_esp(long double x, int m, long double z, long double eps) {
- long double a = (1.0l - z) / (1.0l + z), s = 0.0l, qeps = 4.0l * eps, p = 1.0l, q = a, lk = q / p;
- int n = 0;
- while (lk > qeps) {
- s += lk;
- n += 1;
- p += 2.0l;
- q *= a * a;
- lk = q / p;
- }
- long double rn = 0.25l / (long double)(2 * n + 1) * pow(1.0l / 3.0l, 2 * n - 1);
- long double val = ((long double)m) * 0.69314718056l - 2.0l * s - rn;
- return { n, val, abs(log2(x) * 0.69314718056l - val), rn };
- }
- result_t func_len(long double x, int m, long double z, int n) {
- long double a = (1.0l - z) / (1.0l + z), s = 0.0l, p = 1.0l, q = a, lk = q / p;
- long double rn = 0.25l / (long double)(2 * n + 1) * pow(1.0l / 3.0l, 2 * n - 1);
- while (--n > 0) {
- s += lk;
- p += 2.0l;
- q *= a * a;
- lk = q / p;
- }
- long double val = ((long double)m) * 0.69314718056l - 2.0l * s - rn;
- return { n, val, abs(log2(x) * 0.69314718056l - val), rn };
- }
- int main() {
- long double a = 0.1l, b = 15.0l, x = (a + b) / 2.0l, z = 1.0l, p = 1.0l, h = (b - a) / 10.0l;
- int m = 0;
- while (x > 0.0l) {
- z = x / p;
- if ((z >= 0.5l) && (z <= 1.0l)) break;
- p *= 2.0l;
- m++;
- }
- printf("[%f, %f]\nx = %f = 2^m * z\nm = %d\nz = %f\n\n", a, b, x, m, z);
- printf("| eps | n | absolute error | remainder term |\n");
- for (long double eps = 1e-2l; eps > 1e-14l; eps *= 1e-3l) {
- result_t res = func_esp(x, m, z, eps);
- printf("| %3.0e | %i | %14f | %14f |\n", eps, res.n, res.absolute_error, res.remainder_term);
- }
- int n = func_esp(x, m, z, 1e-8l).n;
- printf("\n| x | absolute error | remainder term |\n");
- for (int i = 0; i <= 10; i++) {
- long double x = a + h * (long double)i;
- result_t res = func_len(x, m, z, n);
- printf("| %-5g | %14f | %14f |\n", x, res.absolute_error, res.remainder_term);
- }
- }
Add Comment
Please, Sign In to add comment