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 ( я его с контроллера через ком порт тяну) и мне его надо сконвертить в нормальный флоат (десятичный)...
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-шного типов, аккуратно рассовать всё куда надо.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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"?
Здравствуйте, Аноним, Вы писали:
А>Что ты имеешь в виду? Чем "число типа float" отличается от "нормальному float"?
Я имею ввиду, что в МК у меня есть 4-е байта (последовательно полученных по порту), дальше мне нужно из них получить число типа float (с МК все впорядке он подтерживает этот тип данных). Например:
PC -> МК
2.1 0х40006666
если на МК присвоить это число в перменную типа float, то это не будет 2.1, вот о чем я понимаете. Когда же я разбираю это число на (знак, мантису, экспоненту), то все хорошо, единственная проблема: разбор происходит в прерывании, и мой алгоритм не оптимален, поэтому я и спрашиваю нет ли стандартных вещей для преобразования.
Здравствуйте, 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):
Здравствуйте, 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
т.е. стандартных функций нет, все самому делать?