Advertisement
Clementine05

РГЗ

Jan 10th, 2025 (edited)
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.53 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. void checkMemoryAllocation(char* array, const char* type) {
  7.     if (array == NULL) {
  8.         printf("ERROR: memory allocation error for %s.\n", type);
  9.         exit(0);
  10.     }
  11. }
  12.  
  13. void printBinary(unsigned long long num, int bits) {
  14.     for (int i = bits - 1; i >= 0; i--) {
  15.         printf("%d", (num >> i) & 1);
  16.     }
  17. }
  18.  
  19. char* getIntegerBinary(long long num) {
  20.     if (num < 0)  num = -num;
  21.  
  22.     char* buffer = (char*)malloc(65);
  23.     checkMemoryAllocation(buffer, "buffer");
  24.  
  25.     int i = 0;
  26.     while (num > 0) {
  27.         buffer[i] = num % 2 ? '1' : '0';
  28.         num /= 2;
  29.         i++;
  30.     }
  31.     buffer[i] = '\0';
  32.  
  33.     char* result = (char*)malloc(i + 1);
  34.     checkMemoryAllocation(result, "result (integer)");
  35.  
  36.     for (int j = 0; j < i; j++) {
  37.         result[j] = buffer[i - j - 1];
  38.     }
  39.     result[i] = '\0';
  40.  
  41.     if (i == 0) {
  42.         result[0] = '0';
  43.         result[1] = '\0';
  44.     }
  45.  
  46.     free(buffer);
  47.     return result;
  48. }
  49.  
  50. int getBinaryToDecimalInteger(char* binary) {
  51.     int decimal = 0;
  52.     int length = strlen(binary);
  53.     int base = 1; // Represents 2^(length - i - 1)
  54.  
  55.     for (int i = length - 1; i >= 0; i--) {
  56.         if (binary[i] == '1') {
  57.             decimal += base;
  58.         } else if (binary[i] != '0') {
  59.             printf("ERROR: Incorrect symbol '%c' in binary\n", binary[i]);
  60.             return -1;
  61.         }
  62.         base *= 2;
  63.     }
  64.  
  65.     return decimal;
  66. }
  67.  
  68. char* getFractionalBinary(double fractional) {
  69.     if (fractional < 0) fractional = -fractional;
  70.  
  71.     char* result = (char*)malloc(1053); // Увеличен размер массива для уменьшения погрешности
  72.     checkMemoryAllocation(result, "result (fractional)");
  73.  
  74.     for (int i = 0; i < 1052; i++) {
  75.         fractional *= 2;
  76.         if (fractional >= 1.0) {
  77.             result[i] = '1';
  78.             fractional -= 1.0;
  79.         } else {
  80.             result[i] = '0';
  81.         }
  82.         if (fractional == 0.0) {
  83.             result[i + 1] = '\0';
  84.             return result;
  85.         }
  86.     }
  87.     result[1052] = '\0';
  88.     return result;
  89. }
  90.  
  91. double getBinaryToDecimalFractional(char* binary) {
  92.     double decimal = 0.0;
  93.     double base = 0.5; // Represents 2^-(i + 1)
  94.  
  95.     for (int i = 0; binary[i] != '\0'; i++) {
  96.         if (binary[i] == '1') {
  97.             decimal += base;
  98.         } else if (binary[i] != '0') {
  99.             printf("ERROR: Incorrect symbol '%c' in binary\n", binary[i]);
  100.             return 0.0;
  101.         }
  102.         base /= 2;
  103.     }
  104.  
  105.     return decimal;
  106. }
  107.  
  108. int main() {
  109.     double number;
  110.     printf("\n\n------------------------------------------------------------------------------------\n");
  111.     printf("\n  Enter number: ");
  112.     scanf("%lf", &number);
  113.  
  114.     union {
  115.         float f;
  116.         unsigned int i;
  117.     } converter32;
  118.  
  119.     converter32.f = (float)number;
  120.  
  121.     unsigned int sign32 = (converter32.i >> 31) & 1;
  122.     unsigned int exponent32 = (converter32.i >> 23) & 0xFF;
  123.     unsigned int mantissa32 = converter32.i & 0x7FFFFF;
  124.  
  125.     int exponentValue32 = exponent32 - 127;
  126.  
  127.     printf("\n---------------------------------------Float----------------------------------------\n");
  128.  
  129.     printf("\n  Number:         %f", (float)number);
  130.  
  131.     printf("\n  Machine code:   ");
  132.     printBinary(converter32.i, 32);
  133.  
  134.     printf("\n  Sign:           %u", sign32);
  135.  
  136.     printf("\n  Order:          %d", exponentValue32);
  137.  
  138.     printf("\n  Exponent:       %d", exponent32);
  139.  
  140.     printf("\n  Characteristic: ");
  141.     printBinary(exponent32, 9);
  142.  
  143.     printf("\n  Mantissa:       ");
  144.     printBinary(mantissa32, 23);
  145.  
  146.     union {
  147.         double f;
  148.         unsigned long long i;
  149.     } converter;
  150.  
  151.     converter.f = number;
  152.  
  153.     unsigned long long sign = (converter.i >> 63) & 1;
  154.     unsigned long long exponent = (converter.i >> 52) & 0x7FF;
  155.     unsigned long long mantissa = converter.i & 0xFFFFFFFFFFFFF;
  156.  
  157.     int exponentValue = exponent - 1023;
  158.  
  159.     printf("\n\n---------------------------------------Double---------------------------------------\n");
  160.  
  161.     printf("\n  Number:         %lf", number);
  162.  
  163.     printf("\n  Machine code:   ");
  164.     printBinary(converter.i, 64);
  165.  
  166.     printf("\n  Sign:           %llu", sign);
  167.  
  168.     printf("\n  Order:          %d", exponentValue);
  169.  
  170.     printf("\n  Exponent:       %llu", exponent);
  171.  
  172.     printf("\n  Characteristic: ");
  173.     printBinary(exponent, 11);
  174.  
  175.     printf("\n  Mantissa:       ");
  176.     printBinary(mantissa, 52);
  177.  
  178.     long long integerPart = (long long)number;
  179.     double fractionalPart = number - integerPart;
  180.     char* integerBinary = getIntegerBinary(integerPart);
  181.     char* fractionalBinary = getFractionalBinary(fractionalPart);
  182.  
  183.     printf("\n\n------------------------------------------------------------------------------------\n");
  184.  
  185.     printf("\n  Integer part in binary:     %s", integerBinary);
  186.  
  187.     printf("\n  Fractional part in binary:  %s", fractionalBinary);
  188.  
  189.     printf("\n  Both parts in binary:       %s.%s", integerBinary, fractionalBinary);
  190.  
  191.     printf("\n  Integer part in decimal:    %d", getBinaryToDecimalInteger(integerBinary));
  192.  
  193.     printf("\n  Fractional part in decimal: %.64lf", getBinaryToDecimalFractional(fractionalBinary));
  194.  
  195.     printf("\n  Both parts in decimal:      %.64lf", getBinaryToDecimalInteger(integerBinary) + getBinaryToDecimalFractional(fractionalBinary));
  196.  
  197.     printf("\n\n------------------------------------------------------------------------------------\n\n\n");
  198.     return 0;
  199. }
  200.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement