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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
#1

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

02.02.2014, 19:32. Просмотров 642. Ответов 21
Метки нет (Все метки)

Здравствуйте!

Кто-нибудь знает как получить битики у 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++;
}
Уже что только не пробовал!

Как это можно реализовать? Подскажите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 19:32     Как получить битики float
Посмотрите здесь:

Получить в вектора, float - C++
Здравствуйте. Есть: Vector vecAngle; Как получить float *flAngle с него?

Из числа float получить два int-a: целую и дробную части - C++
Всем привет. Как можно из числа float получить два inta. приведу пример: есть 1,45 и 2,397. из первого нужно получить 1 и 45, из второго 2...

как победить Double? Float? - C++
C++ - так описать нельзя( ну и как мне ее сделать глобальной и есть ли ограничение на кол-во переменных типа ?????? у меня их...

Как работать с float векторами? - C++
Есть функция: void Vectors_Init( const float *VecStart, const float *VecEnd ) Как допустим сделать вычисления ? С VecEnd вычесть...

Как перевести из Float в String? - C++
Вот такой код: MemoryManager* MM = new MemoryManager(&quot;gta_sa.exe&quot;); DWORD offsets = { 0x14, 0x30 }; float ammo = 10; ...

Как правильно поделить float - C++
Всем доброго времени суток. Решаю задачу по подбору минимального количества необходимых номиналов копеек на определенную сумму. ...

как избавиться от округления float - C++
#include &lt;iostream&gt; using std:: cin; using std:: cout; using std:: endl; int main() { cout &lt;&lt; &quot;123.008 + 0.0008 = &quot; &lt;&lt;...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
Еще ссылки по теме:

Как именно округляются float и double? - C++
Вот имеется double l, функция sqrt из cmath и следующие формулы: sqrt(2-2*sqrt(1-l*l/4)) ...

как вывести float без экспоненты? - C++
void initialize() { for(int i=0; i&lt;TICK; i++) TickspeedRequired=BaseDuration/((i+13)-0.5); //TickspeedRequired - float //...

Как перевести из float -> char[](string)??? - C++
Как преобразовать дробь типа float 0.625 в строку (массив символов). Не используя библиотечные функции, (кроме iostrean.h и iomanip.h)

Как округлить число типо float? - C++
Как округлить число типо float до определенного числа знаков после запятой?

Почему точность Double такая же как у Float ? - C++
Вначале столкнулся с проблемой float: time=65536.0f; (можно и больше число указать) time+=0.003; Тут time не меняетя! Оно меняется,...


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

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

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