|
|
  |
Работа с float..., ...как с обычным 32-х разрядным числом |
|
|
|
Mar 5 2006, 20:33
|
Участник

Группа: Свой
Сообщений: 38
Регистрация: 25-11-05
Из: Россия, Москва
Пользователь №: 11 377

|
Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение: floal_var=float_var&~0x80000000; Ругается: Error[Pe031]: expression must have integral type и всё тут..
|
|
|
|
|
Mar 6 2006, 09:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(e-moe @ Mar 6 2006, 02:33)  Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение: floal_var=float_var&~0x80000000; Ругается: Error[Pe031]: expression must have integral type и всё тут..  Есть два способа: 1. "Не хочет - заставим" через анонимный union: union{ float float_var; long long_var; }; long_var = long_var & ~0x80000000; или грязный хак с указателями: long tmp = *(long*)&float_var & ~0x80000000; float_var = *(float*)&tmp; оба метода неявно завязаны на способ представления типов float и long и указателей на них в конкретном процессоре. 2. "Не умеет - научим" перегрузкой функции operator& (...) Но это только в C++, и хотя бы один из операндов должен быть экземпляром класса или сама функция, реализующая operator& - членом класса.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Mar 6 2006, 12:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(e-moe @ Mar 5 2006, 23:33)  Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение: floal_var=float_var&~0x80000000; Ругается: Error[Pe031]: expression must have integral type и всё тут..  Ну так все правильно говорит (ругается), т.к. число типа float есть форматированное и такие операции применительно к нему компилятором не поддерживаються... Алгебра логики (логические операции) действительны только с двоичной арифметикой. Надо писать свои функции, но прежде определиться по какому основанию (декадному) работать с аналогом float.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Mar 6 2006, 16:19
|
Участник

Группа: Свой
Сообщений: 38
Регистрация: 25-11-05
Из: Россия, Москва
Пользователь №: 11 377

|
Собственно я просто хотел сделать процедуру преобразования float to char, что бы в дальнейшем выводить char на ЖКИ или LPT. Стандартные средства потипу printf немного не подходят, т.к. слишком грамоздко, а мне бы поменьше и побыстрее, и попроще..  Вот я и прикнул, что самое быстрое работать с таким числом как с набором бит, ведь формат числа известен: 31бит - знак 30-23-показатель, 22-0 мантисса
|
|
|
|
|
Mar 6 2006, 16:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(e-moe @ Mar 6 2006, 19:19)  Собственно я просто хотел сделать процедуру преобразования float to char, что бы в дальнейшем выводить char на ЖКИ или LPT. Стандартные средства потипу printf немного не подходят, т.к. слишком грамоздко, а мне бы поменьше и побыстрее, и попроще..  Вот я и прикнул, что самое быстрое работать с таким числом как с набором бит, ведь формат числа известен: 31бит - знак 30-23-показатель, 22-0 мантисса Это делается подругому! Выполняется преобразование float в строку ASSCI символов, а далее по одному символу последовательно выводиться на индикацию. Обычно для этого используется функция sprintf, но так как она требует большого объема для стека, чтобы пользоваться своими библиотеками лучше написать свою используя основу: *str = '0' + ((Digit / (10 * n)) % 10);
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Mar 7 2006, 07:13
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(BVU @ Mar 6 2006, 18:25)  Обычно для этого используется функция sprintf, но так как она требует большого объема для стека, чтобы пользоваться своими библиотеками лучше написать свою используя основу: *str = '0' + ((Digit / (10 * n)) % 10); Если быть точным, то Digit в примере следует заменить на Number (это не одно и то же в английском языке). Но суть в том, что хоть основа и верна, надо не забывать про порядок, и то, нормализована ли мантисса. В целом согласен - в указанном случае лучше писать свою функцию. Хотя иногда бывает проще использовать более мощный контроллер, если есть такая необходимость использовать именно плавающую арифметику. Выделить нужный объем под стек и не мучаться. Зависит от конечной цели.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|