Форум программистов, компьютерный форум CyberForum.ru

Как получить битики float - C++

Восстановить пароль Регистрация
 
 
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
02.02.2014, 19:32     Как получить битики float #1
Здравствуйте!

Кто-нибудь знает как получить битики у float?

C++
1
2
3
4
5
6
7
8
9
10
11
12
 
vector<bool>code;
int i2 = 0;
float one = 1;
float x = 0.36 ;
for (int i = 0; i < 3; i++){
int res = (x & one)>>i2; // с float не работает
if (res) code.push_back(1);
code.push_back(0);
one << 1;
i2++;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
vector<bool>code;
int one = 1;
float x = 0.36 ;
int * ptr = (int*) (&x);
for (int i = 0; i < 3; i++){
int res = (*ptr & one)>>i2; // тоже не получается
if (res) code.push_back(1);
code.push_back(0);
one << 1;
i2++;
}
Уже что только не пробовал!

Как это можно реализовать? Подскажите пожалуйста!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
02.02.2014, 19:39     Как получить битики float #2
Klafe,
C++
1
2
3
4
#include <bitset>
....
float a = 3.;
cout << (bitset<32>) a;
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
02.02.2014, 22:56     Как получить битики float #3
Я проверил: на дробную часть преобразование к bitset<32> не реагирует никак. Как будто, не флоат, а инт преобразуется.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
02.02.2014, 23:00     Как получить битики float #4
Цитата Сообщение от edwvee Посмотреть сообщение
Я проверил: на дробную часть преобразование к bitset<32> не реагирует никак. Как будто, не флоат, а инт преобразуется.
а Вы знаете как хранятся переменные с плавающей запятой? они вообще так и хранятся, как int.

Добавлено через 33 секунды
или я неправильно понял?
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
02.02.2014, 23:04     Как получить битики float #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
а Вы знаете как хранятся переменные с плавающей запятой? они вообще так и хранятся, как int.

Добавлено через 33 секунды
или я неправильно понял?
Не правильно.
Следующие два кода выдают один и тот же результат. Компилятор minGW.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <bitset>
 
using namespace std;
 
int main()
{
    float number;
    number = 9.24452f;
    cout << (bitset<32>) number;
    return 0;
}
и
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <bitset>
 
using namespace std;
 
int main()
{
    int number;
    number = 9;
    cout << (bitset<32>) number;
    return 0;
}
Притом для второго случая выдаваемый результат правилен.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
02.02.2014, 23:22     Как получить битики float #6
edwvee, согласен, в той строке, которую я раньше написал, происходит неявное преобразование doubel к int. вот немного поправил. вроде бы работает
C++
1
2
double a = 9.8768;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Для флоата можно то же самое делать, только преобразовывать к int и 32 байта, вместо 64
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
02.02.2014, 23:42     Как получить битики float #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
edwvee, согласен, в той строке, которую я раньше написал, происходит неявное преобразование doubel к int
Как удалось это выяснить? Интересно.
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 00:34  [ТС]     Как получить битики float #8
Цитата Сообщение от metaluga145 Посмотреть сообщение
Для флоата можно то же самое делать, только преобразовывать к int и 32 байта, вместо 64
Не получается. И так не получается:

C++
1
2
double a = 0.36;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Вот так у меня не работает. Пишет, что с b проблема.

C++
1
2
3
double a = 0.36;
long b;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Вот так выдает не правильный (со всеми дробями одинаковый) результат.

C++
1
2
3
[
double b = 0.36;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Вот так тоже выдает не правильный (со всеми дробями одинаковый) результат.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
03.02.2014, 01:35     Как получить битики float #9
Klafe, хм... Вы хоть бы почитали о том, что я Вам пишу, а в частности про reinterpret_cast.
вот так должно быть правильно
C++
1
2
3
double a = 0.36;
long b;
cout << (bitset<64>) *(reinterpret_cast<long*>(&b)) << endl;
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.02.2014, 02:54     Как получить битики float #10
Своял на коленке:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
 
void showBytes( const void *src, int byteCnt ) {
   if ( byteCnt > 1 )
      showBytes( static_cast< const unsigned char * >( src ) + 1, byteCnt - 1 );
   
   for ( unsigned int i = 0; i < 8; i++ )
      std::cout << (( *static_cast< const unsigned char * >( src ) & ( 128 >> i )) ? '1' : '0' );
   
   std::cout << ' ';
}
 
int main() {
   float a = 9.4;
   double b = 123.3;
   unsigned int c = 1023;
   
   std::string str;
   
   showBytes( &a, sizeof( a ));
   std::cout << std::endl;
   
   showBytes( &b, sizeof( b ));
   std::cout << std::endl;
   
   showBytes( &c, sizeof( c ));
   std::cout << std::endl;
   
   return 0;
}
Ну или с bitset если так хочется его использовать;

C++
1
2
3
4
5
6
7
8
#include <bitset>
 
void showBytes( const void *src, int byteCnt ) {
   if ( byteCnt > 1 )
      showBytes( static_cast< const unsigned char * >( src ) + 1, byteCnt - 1 );
   
   std::cout << std::bitset< 8 >( *static_cast< const unsigned char * >( src )) << ' ';
}
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.02.2014, 03:09     Как получить битики float #11
C++
1
2
3
4
union FloatBit{
    float x;
    char* c;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.02.2014, 03:17     Как получить битики float #12
union не для этого предназначен.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.02.2014, 03:19     Как получить битики float #13
И что мешает предназначить?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.02.2014, 03:32     Как получить битики float #14
UB мешает как бы.
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 03:37  [ТС]     Как получить битики float #15
Всем большое спасибо за помощь!!!

Родил!!!

Просто делаю лабу, необходимо код Шеннона реализовать! Вот была загвоздка (а я C++ так хорошо не знаю).

Бел пол-литра не разберешься!!!

Скажите, а почему нельзя к double или к float применять побитовые операторы (or, and, << и т. д.). Ведь они же в памяти все хранятся ка 0 и 1???

Т. е. какая разница, мы же сдвигаем 0 или 1, а не float или int??

Не понимаю...

PS: а с union я пробовал как здесь написано, у меня не получилось.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.02.2014, 04:59     Как получить битики float #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
UB мешает как бы.
Что это?
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 05:39  [ТС]     Как получить битики float #17
Цитата Сообщение от Toshkarik Посмотреть сообщение
Своял на коленке:
Что-то я рано радовался! Не работает!!!!

Попробовал два разных числа, выдает один и тот же результат!!!

Цитата Сообщение от metaluga145 Посмотреть сообщение
Klafe, хм... Вы хоть бы почитали о том, что я Вам пишу, а в частности про reinterpret_cast.
вот так должно быть правильно
Такая же история!!! Два числа 0.72 и 0.36! Результат один и тот же!!!

Добавлено через 5 минут
И вообще результат не предсказуемый!!!

При переводе на сайтах из десятичной в двоичную получаются одни результаты, в приведенных выше примерах другие!

Добавлено через 11 секунд
И вообще результат не предсказуемый!!!

При переводе на сайтах из десятичной в двоичную получаются одни результаты, в приведенных выше примерах другие!
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 06:01  [ТС]     Как получить битики float #18
Вот есть табличка. В ней нужно числа в столбике Q представить в двоичном виде и взять первые L бит.

Если перевод в двоичную систему делать через онлайн сайты, то все бьется и и сходится.

А по приведенным выше примерам результаты другие.
Миниатюры
Как получить битики float  
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 07:18  [ТС]     Как получить битики float #19
Короче, покумекал, покумекал и решил, что проще будет сделать так:

Для перевода необходимо:

Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения.
0.72*2 = 1.44 (целая часть 1)
0.44*2 = 0.88 (целая часть 0)
0.88*2 = 1.76 (целая часть 1)
0.76*2 = 1.52 (целая часть 1)
Получаем число в 2-ой системе счисления: 1011
0.72 = 1011


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int _tmain(int argc, _TCHAR* argv[]) {
    vector<bool>code;
    double x = 0.72;
 
    for (int i = 0; i < 4; i++) {
        if (i == 0) {
            x = x * 2;
 
        }
 
        if ((int) x == 0) {
            code.push_back(0);
            x = x * 2;
        }
 
        if ((int) x == 1) {
            x = (x - 1) * 2;
            code.push_back(1);
        }
 
    }
    for (int i = 0; i < 4; i++) {
        cout << code[i];
    }
 
    cin.get();
    cin.get();
    return 0;
}
Получается то, что нужно - 1011

Бинго!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 09:55     Как получить битики float
Еще ссылки по теме:

C++ Как правильно поделить float
C++ Чем отличаются float преобразования (float)var от float(var)
Из числа float получить два int-a: целую и дробную части C++
C++ как избавиться от округления float
неверное приведение void* к *float а далее к float C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.02.2014, 09:55     Как получить битики float #20
Вы, видать, не имеете представления о том, как хранятся числа с плавающей точкой в памяти.
Yandex
Объявления
03.02.2014, 09:55     Как получить битики float
Ответ Создать тему
Опции темы

Текущее время: 09:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru