#include <iostream>
#include <cstdint>
#include <bitset>
#include <cmath>
using namespace std;
int main() {
setlocale(LC_ALL, "rus");
const uint8_t expLen = 8; const uint8_t mantissaLen = 23;
bool sign; cout << "Введите бит знака : "; cin >> sign;
uint64_t integer_part; cout << "Введите целую часть : "; cin >> integer_part;
unsigned int fraction_part; cout << "Введите дробную часть : "; cin >> fraction_part;
unsigned int fract_digits_cnt = 0, temp = fraction_part;
uint64_t fractBinary = 0;
while (temp != 0) {
fract_digits_cnt += 1;
temp /= 10;
}
unsigned int divider = pow(10, fract_digits_cnt);
temp = fraction_part;
for (int i = 0; i < mantissaLen; i++) {
fractBinary <<= 1;
temp *= 2;
if (temp / divider) {
fractBinary = fractBinary | 1;
}
temp %= divider;
}
uint64_t mantissa = (integer_part << mantissaLen) | fractBinary;
bitset<64> mantissaBits = mantissa;
int p = 0;
uint64_t checker = 1;
for (int i = 0; i < 64; i++) {
if (mantissa & (checker)) {
p = i;
}
checker <<= 1;
}
p = p - mantissaLen;
if (p > 0) {
mantissa >> p;
}
else {
mantissa << abs(p);
}
unsigned int norm_exponenta = p + (int)pow(2, expLen - 1) - 1;
uint32_t norm_mantissa = mantissa & 0x7FFFFF;
uint32_t full_number = 0;
bitset<23> norm_mantissa_bits = norm_mantissa;
bitset<8> standart_exponenta_bits = p;
full_number |= norm_mantissa;
full_number |= (norm_exponenta << 23);
full_number |= (sign << 31);
bitset<32> full_n_bits = full_number;
cout << "Число на разрядной сетке: " << endl << full_n_bits << endl << endl;
cout << "Число в формате с плавающей точкой: " << endl;
cout << "1." << norm_mantissa_bits << " * E^" << standart_exponenta_bits;
}