Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с float...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
e-moe
Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение:
floal_var=float_var&~0x80000000;
Ругается: Error[Pe031]: expression must have integral type
и всё тут.. sad.gif
SSerge
Цитата(e-moe @ Mar 6 2006, 02:33) *
Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение:
floal_var=float_var&~0x80000000;
Ругается: Error[Pe031]: expression must have integral type
и всё тут.. sad.gif

Есть два способа:
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& - членом класса.
BVU
Цитата(e-moe @ Mar 5 2006, 23:33) *
Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение:
floal_var=float_var&~0x80000000;
Ругается: Error[Pe031]: expression must have integral type
и всё тут.. sad.gif

Ну так все правильно говорит (ругается), т.к. число типа float есть форматированное и такие операции применительно к нему компилятором не поддерживаються... Алгебра логики (логические операции) действительны только с двоичной арифметикой. Надо писать свои функции, но прежде определиться по какому основанию (декадному) работать с аналогом float.
osnwt
Цитата(BVU @ Mar 6 2006, 14:48) *
Надо писать свои функции, но прежде определиться по какому основанию (декадному) работать с аналогом float.

А я бы предложил сначала для себя определиться, что мы вообще хотим делать, куда сдвигать и с чем ксорить. И что хотим получить в итоге. Просто в голове не очень укладывается, зачем может потребоваться выполнить float ^ 0x4274625 ohmy.gif
e-moe
Собственно я просто хотел сделать процедуру преобразования float to char, что бы в дальнейшем выводить char на ЖКИ или LPT.
Стандартные средства потипу printf немного не подходят, т.к. слишком грамоздко, а мне бы поменьше и побыстрее, и попроще.. smile.gif Вот я и прикнул, что самое быстрое работать с таким числом как с набором бит, ведь формат числа известен: 31бит - знак 30-23-показатель, 22-0 мантисса
BVU
Цитата(e-moe @ Mar 6 2006, 19:19) *
Собственно я просто хотел сделать процедуру преобразования float to char, что бы в дальнейшем выводить char на ЖКИ или LPT.
Стандартные средства потипу printf немного не подходят, т.к. слишком грамоздко, а мне бы поменьше и побыстрее, и попроще.. smile.gif Вот я и прикнул, что самое быстрое работать с таким числом как с набором бит, ведь формат числа известен: 31бит - знак 30-23-показатель, 22-0 мантисса

Это делается подругому! Выполняется преобразование float в строку ASSCI символов, а далее по одному символу последовательно выводиться на индикацию. Обычно для этого используется функция sprintf, но так как она требует большого объема для стека, чтобы пользоваться своими библиотеками лучше написать свою используя основу: *str = '0' + ((Digit / (10 * n)) % 10);
e-moe
Хм... А есть возможность у кого-нибудь привести законченый вареант функии преобразования float to char. На входе float на выходе указатель на готовую строку. Интересно макимально простая реализация, максимально быстрая, было бы неплохо если бы были пояснения... smile.gif
osnwt
Цитата(BVU @ Mar 6 2006, 18:25) *
Обычно для этого используется функция sprintf, но так как она требует большого объема для стека, чтобы пользоваться своими библиотеками лучше написать свою используя основу: *str = '0' + ((Digit / (10 * n)) % 10);

Если быть точным, то Digit в примере следует заменить на Number (это не одно и то же в английском языке). Но суть в том, что хоть основа и верна, надо не забывать про порядок, и то, нормализована ли мантисса.

В целом согласен - в указанном случае лучше писать свою функцию. Хотя иногда бывает проще использовать более мощный контроллер, если есть такая необходимость использовать именно плавающую арифметику. Выделить нужный объем под стек и не мучаться. Зависит от конечной цели.
BVU
Цитата(e-moe @ Mar 6 2006, 22:43) *
Хм... А есть возможность у кого-нибудь привести законченый вареант функии преобразования float to char. На входе float на выходе указатель на готовую строку. Интересно макимально простая реализация, максимально быстрая, было бы неплохо если бы были пояснения... smile.gif

Читайте темы форума (в основном на AVR), там много говорилось об этом и приводились способы реализации конвертора float to string. Так же можете разобрать исходник функции sprintf.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.