dark-s0ul

Untitled

Sep 15th, 2017 (edited)
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cmath>
  5.  
  6. struct result_t {
  7.     int n;
  8.     long double value, absolute_error, remainder_term;
  9. };
  10.  
  11. result_t func_esp(long double x, int m, long double z, long double eps) {
  12.     long double a = (1.0l - z) / (1.0l + z), s = 0.0l, qeps = 4.0l * eps, p = 1.0l, q = a, lk = q / p;
  13.     int n = 0;
  14.  
  15.     while (lk > qeps) {
  16.         s += lk;
  17.         n += 1;
  18.  
  19.         p += 2.0l;
  20.         q *= a * a;
  21.         lk = q / p;
  22.     }
  23.    
  24.     long double rn = 0.25l / (long double)(2 * n + 1) * pow(1.0l / 3.0l, 2 * n - 1);
  25.     long double val = ((long double)m) * 0.69314718056l - 2.0l * s - rn;
  26.     return { n, val, abs(log2(x) * 0.69314718056l - val), rn };
  27. }
  28.  
  29. result_t func_len(long double x, int m, long double z, int n) {
  30.     long double a = (1.0l - z) / (1.0l + z), s = 0.0l, p = 1.0l, q = a, lk = q / p;
  31.     long double rn = 0.25l / (long double)(2 * n + 1) * pow(1.0l / 3.0l, 2 * n - 1);
  32.  
  33.     while (--n > 0) {
  34.         s += lk;
  35.  
  36.         p += 2.0l;
  37.         q *= a * a;
  38.         lk = q / p;
  39.     }
  40.  
  41.     long double val = ((long double)m) * 0.69314718056l - 2.0l * s - rn;
  42.     return { n, val, abs(log2(x) * 0.69314718056l - val), rn };
  43. }
  44.  
  45. int main() {
  46.     long double a = 0.1l, b = 15.0l, x = (a + b) / 2.0l, z = 1.0l, p = 1.0l, h = (b - a) / 10.0l;
  47.     int m = 0;
  48.  
  49.     while (x > 0.0l) {
  50.         z = x / p;
  51.         if ((z >= 0.5l) && (z <= 1.0l)) break;
  52.         p *= 2.0l;
  53.         m++;
  54.     }
  55.  
  56.     printf("[%f, %f]\nx = %f = 2^m * z\nm = %d\nz = %f\n\n", a, b, x, m, z);
  57.     printf("|  eps  | n | absolute error | remainder term |\n");
  58.     for (long double eps = 1e-2l; eps > 1e-14l; eps *= 1e-3l) {
  59.         result_t res = func_esp(x, m, z, eps);
  60.         printf("| %3.0e | %i | %14f | %14f |\n", eps, res.n, res.absolute_error, res.remainder_term);
  61.     }
  62.     int n = func_esp(x, m, z, 1e-8l).n;
  63.     printf("\n|   x   | absolute error | remainder term |\n");
  64.     for (int i = 0; i <= 10; i++) {
  65.         long double x = a + h * (long double)i;
  66.         result_t res = func_len(x, m, z, n);
  67.         printf("| %-5g | %14f | %14f |\n", x, res.absolute_error, res.remainder_term);
  68.     }
  69. }
Add Comment
Please, Sign In to add comment