C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
представление float переменных
Evdokimov
Отправлено: 22.02.2006, 02:12


Не зарегистрирован







Может кто подскажет. Нужно как-то вытащить число в плавающем формате в том виде, в каком оно хранится в машине, его внутренне представление. Все байты в шестнадцатиричном виде.
BadMan
Отправлено: 22.02.2006, 09:20


Дежурный стрелочник

Группа: Участник
Сообщений: 37



float a;
unsigned char *Buff;

Buff = (char*) &a;

Дальше по адресу Buff хранится цепочка байтов длинной sizeof(float).
Вместо или unsigned char можно взять тип byte.
А по поводу шестнадцатеричного вида — это как душе угодна, машина умеет хранить только в двоичном виде, восьмеричный, шестнадцетеричный — это уже по надобности — отображай как хочешь.
AVC
Отправлено: 22.02.2006, 09:23


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Нужно как-то вытащить число в плавающем формате в том виде, в каком оно хранится в машине

Если делать на С — почитать учебники по языку
или переформулировать более грамотно вопрос.
John
Отправлено: 22.02.2006, 10:05


Не зарегистрирован







Можно вот так верно работает проверяй:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
float *point;
float a=3.5;//любое число можно вставить
AnsiString S;
unsigned char buf_float[4];
point=&a;
memcpy(buf_float,point,4);//функция работает с областью памяти
for (int i=0;i<4;i++)
{
S.printf("%X",buf_float[i]);
Edit1->Text=Edit1->Text+"0x"+S+" ";
}

}
avc*
Отправлено: 22.02.2006, 10:33


Не зарегистрирован







Нельзя полагаться на то, что float ВСЕГДА 4 байта — лучше использовать sizeof(float)
Незачем гонять байты из памяти в память, лучше использовать указатель как это сделано у BadMan
В вопросе не было "как показать в компоненте", может автор имел ввиду что-то своё. smile.gif

Формально — ответом на вопрос может быть код float a = 3.14. Здесь константа 3.14 "вытаскивается" в переменную a именно "в том виде, в каком оно хранится в машине, его внутренне представление".
John
Отправлено: 22.02.2006, 11:07


Не зарегистрирован







Я предложил как один из вариантов ничег более.
А как понятнее будет Evdokimov ему решать. Если учесть все замечания то получится так:

float a=3.5;
unsigned char buf_float[sizeof(float)];
memcpy(buf_float,&a,sizeof(float));

Grigoriy
Отправлено: 22.02.2006, 12:48


Мастер участка

Группа: Участник
Сообщений: 381



Подождите, я отвечу сегодня.

Я не могу сейчас ответить. У меня дома нет сетевого подключения. Пишет сетевой кабель не подключен. И у всег моих сосетян тоже самое.
Пишу из клуба, что у меня "под комнатой" на низу.

Пойду к себе домой. Напишу код. Приду с дискетой и скопирую.
viva
Отправлено: 22.02.2006, 13:03


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Вопрос Evdokimova очень странен.
Может он просит структуру IEEE и как раскрыть её из последовательности байтов?
Konstantine
Отправлено: 22.02.2006, 15:00


Мастер участка

Группа: Модератор
Сообщений: 545



CODE

union {float ft;
           char ch[4];} fl_ch;

fl_ch.ft=3.14;
fl_ch.ch[i]; // байты...


Отредактировано Konstantine — 22/02/2006, 15:04
Grigoriy
Отправлено: 22.02.2006, 19:04


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE
Если делать на С — почитать учебники по языку
или переформулировать более грамотно вопрос.


Или предоставить полную информацию по машинному представлению числа с плавающей точкой в этом форуме.

Читайте присоединенное изображение.


В общем выведенный мною код следующий...
CODE

AnsiString floattohexadecimalshow(long double ld, unsigned char* v,int kolb)
{
/*Функция возвращает строку с шестнадцатеричным представлением числа с плавающей точкой в нужной точности (4, 8 или 10 байтов)*/
AnsiString ret1;
void* p;
ret1.SetLength(kolb*2);
p=ret1.c_str();
asm{
//fninit;
/*Подзадача 1
сохранение числа в нужной точности результата
точность — количество байтов — хранится в переменной kolb
(4, 8, 10)*/
mov edi,p;
mov esi,v;
mov ecx,kolb;
fld tbyte ptr ld;
cmp ecx,8;
jbe @1;
fstp tbyte ptr [esi];
jmp @7;
@1:cmp ecx,4;
jz @2;
fstp qword ptr [esi];
jmp @7;
@2:fstp dword ptr [esi];
@7:
/*Подзадача 2
Перевод последовательности байтов в шестнадцатеричное представление*/
cld;
@c1:lodsb;
mov dl,al;
mov bl,al;
and bl,15;
shr dl,4;
and dl,15;
mov al,'0';
add al,dl;
cmp dl,10;
jb @3;
add al,7;
@3:
stosb;
mov al,'0';
add al,bl;
cmp bl,10;
jb @4;
add al,7;
@4:
stosb;
loop @c1;
};
return ret1;
};


Пример...
CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString rre;
unsigned char v1[10];
rre=floattohexadecimalshow(1.7,v1,8);
Edit1->Text=rre;
}


И читаем...

Присоединить изображение

Присоединить изображение

Guest
Отправлено: 23.02.2006, 00:15


Не зарегистрирован







Спасибо всем. Неожиданно, так много ответов и даже учебник не поленились отсканировать. Учебник я читал. Пробовал самый первый вариант, но не с char, а с int. Не работал. Иду пробовать то, что было предложенно.

Вернуться в Вопросы программирования в C++Builder