Advertisement
Clementine05

DICH

Jan 17th, 2025
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.90 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. unsigned znak(unsigned long long h) {
  4.     return h >> 63;
  5. }
  6.  
  7. unsigned long long mantissa(unsigned long long h) {
  8.     return (h & 0xFFFFFFFFFFFFF) | 0x10000000000000;
  9. }
  10.  
  11. int poradok(unsigned long long h) {
  12.     return (h >> 52) & 0x7FF;
  13. }
  14.  
  15. void poradokd(unsigned long long h)
  16. {
  17.     int i, y[11];
  18.     for (i = 0; i < 11; i++) {
  19.         y[i] = h % 2;
  20.         h /= 2;
  21.     }
  22.  
  23.     for (i = 10; i >= 0; i--) printf("%d", y[i]);
  24. }
  25.  
  26. void mantisad(unsigned long long h)
  27. {
  28.     int i, y[52];
  29.  
  30.     for (i = 0; i < 52; i++) {
  31.         y[i] = h % 2;
  32.         h /= 2;
  33.     }
  34.  
  35.     for (i = 51; i >= 0; i--) printf("%d", y[i]);
  36. }
  37.  
  38. void celoev2(long long h)
  39. {
  40.     int i = 0, j;
  41.     int y[64];
  42.  
  43.     if (h <= 0) {
  44.         h = -h;
  45.         printf("0");
  46.     }
  47.  
  48.     while (h != 0) {
  49.         y[i] = h % 2;
  50.         h /= 2;
  51.         i++;
  52.     }
  53.  
  54.     for (j = i - 1; j >= 0; j--)
  55.         printf("%d", y[j]);
  56. }
  57.  
  58. void drobv2(double h) {
  59.     int r; h -= (int)h;
  60.     if (h < 0) { h = -h; printf("-0."); }
  61.     else printf("0.");
  62.     for (int i = 0; i < 52 && h != 0; i++) {
  63.         h *= 2;        r = (int)h;
  64.         h -= r;        printf("%d", r);
  65.     }
  66. }
  67.  
  68.  
  69. unsigned long long celoepoman(unsigned long long h, int p)
  70. {
  71.     p -= 1023;
  72.     return h >> (52 - p);
  73. }
  74.  
  75. unsigned long long drobpoman(unsigned long long h, int p)
  76. {
  77.     p -= 1023;
  78.     return h << (12 + p) >> (12 + p);
  79. }
  80.  
  81. int umnozheniye(int* y)
  82. {
  83.     int i, j, b = 0, y1[1052] = { 0 }, y2[1052] = { 0 }, res[1052] = { 0 }, r = 0;
  84.  
  85.     for (i = 3; i < 1051; i++)
  86.         y1[i] = y[i - 3];
  87.     for (i = 1; i < 1049; i++)
  88.         y2[i] = y[i - 1];
  89.  
  90.     for (i = 1051; i >= 0; i--) {
  91.         res[i] = y1[i] + y2[i] + b;
  92.         if (res[i] >= 2) {
  93.             res[i] -= 2;
  94.             b = 1;
  95.         }
  96.         else {
  97.             b = 0;
  98.         }
  99.     }
  100.  
  101.     for (i = 0; i < 4; i++) {
  102.         b = 1;
  103.         for (j = 0; j < 3 - i; j++) b *= 2;
  104.         r += res[i] * b;
  105.     }
  106.  
  107.     for (i = 0; i < 1048; i++) y[i] = res[i + 4];
  108.  
  109.     return r;
  110. }
  111.  
  112. int esli0(int* y)
  113. {
  114.     for (int i = 0; i < 1052; i++) {
  115.         if (y[i] != 0) {
  116.             return 0;
  117.         }
  118.     }
  119.     return 1;
  120. }
  121.  
  122. void obratno(unsigned long long h, long long p)
  123. {
  124.     int i, y[1052] = { 0 }, res[256] = { 0 };
  125.  
  126.     p -= 1023;
  127.     h <<= (12 + p);
  128.  
  129.     for (i = 0; i < 64; i++) {
  130.         y[i] = (h << i) >> 63;
  131.     }
  132.  
  133.     for (i = 64; i < 1052; i++) {
  134.         y[i] = 0;
  135.     }
  136.  
  137.     int index = 0;
  138.     while (!esli0(y) && index < 256) {
  139.         res[index] = umnozheniye(y);
  140.         index++;
  141.     }
  142.  
  143.     for (int j = 0; j < index; j++) {
  144.         printf("%d", res[j]);
  145.     }
  146. }
  147.  
  148. int main()
  149. {
  150.     union {
  151.         unsigned long long i;
  152.         double h;
  153.     } a;
  154.  
  155.     printf("n= ");
  156.     scanf_s("%lf", &a.h);
  157.     printf("\nV 2 vide: %d", znak(a.i));
  158.     poradokd(poradok(a.i));
  159.     printf(" ");
  160.     mantisad(mantissa(a.i));
  161.     printf(" ");
  162.  
  163.     mantisad(mantissa(a.i));
  164.     printf("\n\nZnak: %d", znak(a.i));
  165.     printf("\nHaracteristica: "); poradokd(poradok(a.i));
  166.     printf("\nMantissa:"); mantisad(mantissa(a.i));
  167.     printf("\n\nPoryadok: %d", poradok(a.i) - 1023);
  168.     printf("\n\nCeloe v 2 vide: ");
  169.     celoev2(celoepoman(mantissa(a.i), poradok(a.i)));
  170.     printf("\n\nDrob v 2 vide:");
  171.     int p = poradok(a.i) - 1023;
  172.     double fractional_part = (double)drobpoman(mantissa(a.i), poradok(a.i)) / (1LL << (52 - p));
  173.     drobv2(fractional_part);
  174.     printf("\n\nCeloe v 10 vide: %lld", znak(a.i) == 1 ? -1 * celoepoman(mantissa(a.i), poradok(a.i)) : celoepoman(mantissa(a.i), poradok(a.i)));
  175.     printf("\n\nDrob v 10 vide:  %c0.", znak(a.i) == 1 ? '-' : ' '); obratno(drobpoman(mantissa(a.i), poradok(a.i)), poradok(a.i));
  176.     printf("\n\nChislo v 10 vide:%c%lld.", znak(a.i) == 1 ? '-' : ' ', celoepoman(mantissa(a.i), poradok(a.i))); obratno(drobpoman(mantissa(a.i), poradok(a.i)), poradok(a.i));
  177.     printf("\n");
  178. }
  179.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement