Advertisement
dark-s0ul

lab1.cpp

Dec 17th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <math.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. struct result {
  7.     int n;
  8.     double abs, rn;
  9. };
  10.  
  11. result func(double x, double eps) {
  12.     int m = 1, k = 2;
  13.    
  14.     while (x > k) {
  15.         k = k * 2;
  16.         m++;
  17.     }
  18.    
  19.     double z = x / k;
  20.     double a = (1 - z) / (1 + z);
  21.     double ln, sum_ln = 0;
  22.     double e4 = eps * 4;
  23.     int n = 0;
  24.     for (int i = 1; i != 0; i++) {
  25.         ln = (pow(a, (2 * i - 1)) / (2 * i - 1));
  26.         sum_ln += ln;
  27.         if (ln < e4) {
  28.             n = i;
  29.             break;
  30.         }
  31.     }
  32.     double rn = ln / 4;
  33.  
  34.     return { n, abs(log(x) - (m * log(2) - 2 * sum_ln - rn)), rn };
  35. };
  36.  
  37. result func2(double xi, int n) {
  38.     int m = 1, k = 2;
  39.     while (xi > k) {
  40.         k = k * 2;
  41.         m++;
  42.     }
  43.     double z = xi / k;
  44.     double a = (1 - z) / (1 + z);
  45.     double ln, lk = 0;
  46.     for (int i = 1; i <= n; i++) {
  47.         ln = (pow(a, (2 * i - 1)) / (2 * i - 1));
  48.         lk += ln;
  49.     }
  50.    
  51.     double rn = ln / 4;
  52.  
  53.     return { n, abs(log(xi) - (m * log(2) - 2 * lk - rn)), rn };
  54.  
  55. }
  56.  
  57. int main() {
  58.     double a = 0.1;
  59.     double b = 15;
  60.     double x = (a + b) * 0.5;
  61.  
  62.     cout << "_____________________________________" << endl;
  63.     cout << "| eps  | n | Abs error |  Rem term  |" << endl;
  64.     double eps = 1e-2;
  65.     for (int i = 0; i < 5; i++) {
  66.         result res = func(x, eps);
  67.  
  68.         cout << "| " << eps << " | " << res.n << " | " << res.abs << " | " << res.rn << " |" << endl;
  69.  
  70.         eps *= 1e-3;
  71.     }
  72.  
  73.     int n = func(x, 1e-8).n;
  74.  
  75.     double h = (b - a) / 10;
  76.     cout << "_____________________________________" << endl;
  77.     cout << "| xi | Abs. error | Rem term |" << endl;
  78.     for (int i = 0; i <= 10; i++) {
  79.         double xi = a + h * i;
  80.         result res = func2(xi, n);           
  81.         cout << "| " << xi << " | " << res.abs << " | " << res.rn << " |" << endl;
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement