Загрузка данных


#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;
}