float to hex и наоборот
От: DENISIUS Украина  
Дата: 28.01.05 19:12
Оценка:
как заюзать сабж?
Jesus is Lord...
Re: float to hex и наоборот
От: ddanila Россия  
Дата: 28.01.05 23:12
Оценка:
Просто:
float a = 1.23;
char buffer[1024];
snprintf("%x", a, 1024);
Re[2]: float to hex и наоборот
От: Аноним  
Дата: 28.01.05 23:55
Оценка:
Здравствуйте, ddanila, Вы писали:

D>Просто:

D>
D>float a = 1.23;
D>char buffer[1024];
D>snprintf("%x", a, 1024);
D>


нет.... этот вариант только для целых чичел....читай msdn

вообщето задача обратная у меня есть строка в кторой хексовый float ( я его с контроллера через ком порт тяну) и мне его надо сконвертить в нормальный флоат (десятичный)...
Re[3]: float to hex и наоборот
От: Кодт Россия  
Дата: 29.01.05 10:04
Оценка:
Здравствуйте, Аноним, Вы писали:

D>>Просто:

D>>
D>>float a = 1.23;
D>>char buffer[1024];
D>>snprintf("%x", a, 1024);
D>>


Этот фокус не проедет. float через (...) передаётся как double, т.е. 8-байтное. Ты распечатаешь только первые 4 байта.
К тому же, там должно быть snprintf(buffer, limit, format, arguments...).

А>нет.... этот вариант только для целых чичел....читай msdn


А>вообщето задача обратная у меня есть строка в кторой хексовый float ( я его с контроллера через ком порт тяну) и мне его надо сконвертить в нормальный флоат (десятичный)...


А что это за такой затейливый формат в гексах? Он как-то соотносится, например, с IEEE-шным float'ом?

В конце концов, ты можешь, зная битовые карты контроллеровского и IEEE-шного типов, аккуратно рассовать всё куда надо.
Перекуём баги на фичи!
Re[3]: float to hex и наоборот
От: Yuriy7 Россия  
Дата: 21.04.05 06:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ddanila, Вы писали:


D>>Просто:

D>>
D>>float a = 1.23;
D>>char buffer[1024];
D>>snprintf("%x", a, 1024);
D>>


А>нет.... этот вариант только для целых чичел....читай msdn


А>вообщето задача обратная у меня есть строка в кторой хексовый float ( я его с контроллера через ком порт тяну) и мне его надо сконвертить в нормальный флоат (десятичный)...


У меня сейчас задача стоит, с компа по com-порту передаю число типа float в
микроконтроллер. МК принмает эти 4-е байта, мне нужно их привести к
нормальному float. Я писал свою процедурку, т.е. делал разбор битиов
(знак, экспонента, мантиса), но моя реализация занимает недопустимое
время (т.к. это все происходит в прерывании). Не поможете, есть ли
какая-нибудь стандартная C-функция или как решить вопрос по другому?
Re[4]: float to hex и наоборот
От: Аноним  
Дата: 21.04.05 07:22
Оценка:
Y>У меня сейчас задача стоит, с компа по com-порту передаю число типа float в
Y>микроконтроллер. МК принмает эти 4-е байта, мне нужно их привести к
Y>нормальному float.

Что ты имеешь в виду? Чем "число типа float" отличается от "нормальному float"?
Re[5]: float to hex и наоборот
От: Yuriy7 Россия  
Дата: 21.04.05 09:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что ты имеешь в виду? Чем "число типа float" отличается от "нормальному float"?


Я имею ввиду, что в МК у меня есть 4-е байта (последовательно полученных по порту), дальше мне нужно из них получить число типа float (с МК все впорядке он подтерживает этот тип данных). Например:

PC -> МК
2.1 0х40006666

если на МК присвоить это число в перменную типа float, то это не будет 2.1, вот о чем я понимаете. Когда же я разбираю это число на (знак, мантису, экспоненту), то все хорошо, единственная проблема: разбор происходит в прерывании, и мой алгоритм не оптимален, поэтому я и спрашиваю нет ли стандартных вещей для преобразования.
Re[6]: float to hex и наоборот
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.04.05 09:24
Оценка:
Здравствуйте, Yuriy7, Вы писали:

Y>Здравствуйте, Аноним, Вы писали:


А>>Что ты имеешь в виду? Чем "число типа float" отличается от "нормальному float"?


Y>Я имею ввиду, что в МК у меня есть 4-е байта (последовательно полученных по порту), дальше мне нужно из них получить число типа float (с МК все впорядке он подтерживает этот тип данных). Например:


Y>PC -> МК

Y>2.1 0х40006666

Y>если на МК присвоить это число в перменную типа float, то это не будет 2.1, вот о чем я понимаете. Когда же я разбираю это число на (знак, мантису, экспоненту), то все хорошо, единственная проблема: разбор происходит в прерывании, и мой алгоритм не оптимален, поэтому я и спрашиваю нет ли стандартных вещей для преобразования.


Если твой MK поддерживает представление float согласно IEEE 754, то проблема может быть в разнице порядка следования байт на МК и ПК. На x86 принят Little Endian (т.е. младшее слово, старшее слово, младший байт, старший байт). На МК, вероятно, BigEndian. Если это так, то при передачи float-а с ПК на МК нужно просто преобразовать его в BigEndian.
Я делал это так (single_t это typedef для float):
void
big_endian_decoder_t::little_endian(
    oess_1::short_t * p, size_t count )
{
    for( ; count; --count, ++p ) {
        register char * pch = (char *) p;
        register char ch = pch[ 0 ]; pch[ 0 ] = pch[ 1 ]; pch[ 1 ] = ch;
    }
}

void
big_endian_decoder_t::little_endian(
    oess_1::int_t * p, size_t count )
{
    for( ; count; --count, ++p ) {
        oess_1::short_t * pus = (oess_1::short_t *) p;
        oess_1::short_t us = pus[ 0 ]; pus[ 0 ] = pus[ 1 ]; pus[ 1 ] = us;
        little_endian( pus, 2 );
    }
}

void
big_endian_decoder_t::little_endian(
    oess_1::single_t * p, size_t count )
{
    little_endian( (oess_1::int_t *)p, count );
}

Т.к. это симметричные преобразования, то одни и теже функции можно применять для преобразований в обе стороны.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: float to hex и наоборот
От: Yuriy7 Россия  
Дата: 21.04.05 10:51
Оценка:
Здравствуйте, eao197, Вы писали:

E>Т.к. это симметричные преобразования, то одни и теже функции можно применять для преобразований в обе стороны.


Спасибо попробую. Только у меня все равно закраыдваются сомнения. Я сразу не упомянул, я выполнял передачу float-числа на одном ПК с COM1 по COM2 (по кабелю). Вот и там все тоже самое:

c COM1 посылаю 2.10, на COM2 приходит по порядку (0x66,0x66,0x06,0x40), т.е. 0x40066666,
float f = 0x40066666; // f = 1074161254.00
мне понятно что знак=0, Exp=(10000000b) — 127, Man=1.00001100110011001100110
т.е. стандартных функций нет, все самому делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.