bitset c++ сдвиг
cout << "\nВведите число с плавающей точкой: ";
double a;
cin >> a;
auto b = std::bitset<64>(*(unsigned long long*)(&a));
std::cout << "Input: " << b << '\n';
b.set(63);
unsigned long long c = b.to_ullong();
std::cout << "С мантисой: " << (*(double*)(&c)) << '\n';
std::cout << "Binary: " << b << '\n';
cout << "\nВыполнить циклический сдвиг?: (+/-) ";
char choice2;
cin >> choice2;
if (choice2 == '+') {
cout << "В какую сторону выполнить сдвиг? (l - лево | r - право): ";
char side;
cin >> side;
if (side == 'l'){
cout << "Насколько выполнить сдвиг? ";
int b_double;
cin >> b_double; // вводим на сколько сдвиг
b = b <<= b_double; // тут ошибка как я понимаю происходит
cout << "Converted: " << b << endl;
unsigned long long g = b.to_ullong();
std::cout << "Dec: " << (*(double*)(&g)) << '\n';
};
Не очень понимаю почему так происходит: Я ввожу к примеру 12.15, двоичный вид правильный, но когда хочу сделать к примеру сдвиг влево на 1 бит, то получаю 6.75418e+154 в десятичном виде. Как это исправить, чтобы было правильный сдвиг и вывод в десятичной сс.
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Числа хранятся в бинарном режиме.
Есть такая функция битового сдвига для типов double : ldexp
#include <math.h>
double ldexp(double x, int exp);
double d ;
d = ldexp(d , -1); // делим пополам
d = ldexp(d , 2); // умножаем на четыре
Тип double числа представляется как мантисса, умноженная на степень двойки.
мантисса * ( 2 ^ степень )
И по-этому любой битовый сдвиг не трогает мантиссу, и не ухудшает точность ,а всего-лишь прибавляет или уменьшает степень.