реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа с float..., ...как с обычным 32-х разрядным числом
e-moe
сообщение Mar 5 2006, 20:33
Сообщение #1


Участник
*

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



Возможно ли с float работать как с обычным 32-х разрядным числом, выполнять операции сдвига, логические операции? А то на выражение:
floal_var=float_var&~0x80000000;
Ругается: Error[Pe031]: expression must have integral type
и всё тут.. sad.gif
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 6 2006, 09:00
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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
и всё тут.. 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& - членом класса.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
BVU
сообщение Mar 6 2006, 12:48
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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
и всё тут.. sad.gif

Ну так все правильно говорит (ругается), т.к. число типа float есть форматированное и такие операции применительно к нему компилятором не поддерживаються... Алгебра логики (логические операции) действительны только с двоичной арифметикой. Надо писать свои функции, но прежде определиться по какому основанию (декадному) работать с аналогом float.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 6 2006, 14:36
Сообщение #4


Частый гость
**

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



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

А я бы предложил сначала для себя определиться, что мы вообще хотим делать, куда сдвигать и с чем ксорить. И что хотим получить в итоге. Просто в голове не очень укладывается, зачем может потребоваться выполнить float ^ 0x4274625 ohmy.gif
Go to the top of the page
 
+Quote Post
e-moe
сообщение Mar 6 2006, 16:19
Сообщение #5


Участник
*

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



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


Профессионал
*****

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



Цитата(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);


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
e-moe
сообщение Mar 6 2006, 19:43
Сообщение #7


Участник
*

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



Хм... А есть возможность у кого-нибудь привести законченый вареант функии преобразования float to char. На входе float на выходе указатель на готовую строку. Интересно макимально простая реализация, максимально быстрая, было бы неплохо если бы были пояснения... smile.gif
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 7 2006, 07:13
Сообщение #8


Частый гость
**

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



Цитата(BVU @ Mar 6 2006, 18:25) *
Обычно для этого используется функция sprintf, но так как она требует большого объема для стека, чтобы пользоваться своими библиотеками лучше написать свою используя основу: *str = '0' + ((Digit / (10 * n)) % 10);

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

В целом согласен - в указанном случае лучше писать свою функцию. Хотя иногда бывает проще использовать более мощный контроллер, если есть такая необходимость использовать именно плавающую арифметику. Выделить нужный объем под стек и не мучаться. Зависит от конечной цели.
Go to the top of the page
 
+Quote Post
BVU
сообщение Mar 7 2006, 07:15
Сообщение #9


Профессионал
*****

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



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

Читайте темы форума (в основном на AVR), там много говорилось об этом и приводились способы реализации конвертора float to string. Так же можете разобрать исходник функции sprintf.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016