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 ^ степень )

И по-этому любой битовый сдвиг не трогает мантиссу, и не ухудшает точность ,а всего-лишь прибавляет или уменьшает степень.

Число двойной точности

→ Ссылка