Страница 1 из 4
Float to String ?
Добавлено: Ср авг 12, 2015 20:04:31
FireProoF
Здравствуйте! Задался вопросом вывода на дисплей значений переменных. Везде советуют использовать sprintf(), но она тянет за собой кучу обвязки и медленная. Нашел такую статью, где протестированны другие методы конвертации. Пытаюсь содрать my_ftoa(), но возникла проблема...Не суть.
Хочу спросить у Вас: "Кто чем пользуется? Может есть решение попроще?".
P.S. stm32f103 + keil
Re: Float to String ?
Добавлено: Ср авг 12, 2015 20:50:27
ave101
Может из этого что-то сделаете.
Код: Выделить всё
// --- Преобразование строки в число ---
void StrTo() {
number=0;
ret = 0;
ret=retstr[0]-0x30;
number=ret*1000000;
ret=retstr[1]-0x30;
number=number+ret*100000;
ret=retstr[2]-0x30;
number=number+ret*10000;
ret=retstr[3]-0x30;
number=number+ret*1000;
ret=retstr[4]-0x30;
number=number+ret*100;
ret=retstr[5]-0x30;
number=number+ret*10;
ret=retstr[6]-0x30;
number=number+ret;
}
// --- Преобразование числа в строку ---
void ToStr() {
uint32_t i;
i=number/1000000;
number=number-i*1000000;
retstr[0] = i + 0x30;
i=number/100000;
number=number-i*100000;
retstr[1] = i + 0x30;
i=number/10000;
number=number-i*10000;
retstr[2] = i + 0x30;
i=number/1000;
number=number-i*1000;
retstr[3] = i + 0x30;
i=number/100;
number=number-i*100;
retstr[4] = i + 0x30;
i=number/10;
number=number-i*10;
retstr[5] = i + 0x30;
retstr[6] = number + 0x30;
}
Re: Float to String ?
Добавлено: Ср авг 12, 2015 22:13:38
ARV
а, извините, что у вас за проект, что библиотека вам "медленная"? это на ARM-е с его десятками мегагерц и немеряным ОЗУ?!
Re: Float to String ?
Добавлено: Чт авг 13, 2015 06:16:49
FireProoF
Проект прост - вывод показаний температурных датчиков на экран. Конечно на моем МК я могу не задумываться о длине кода и скорости его выполнения. Но я хотел научиться делать это как можно оптимизированне.
Поэтому пока буду обрезать дробную часть температуры и выводить как во втором посту.
Re: Float to String ?
Добавлено: Сб авг 15, 2015 13:24:23
es131245
Преобразуй float в byte и глянь, не IEEE754 ли там находится

Re: Float to String ?
Добавлено: Сб авг 15, 2015 14:02:13
КРАМ
Re: Float to String ?
Добавлено: Сб авг 15, 2015 14:15:17
ARV
КРАМ писал(а):32-разрядный МК реализует в ЦЕЛЫХ числах (фиксированная точка) аж 9,5 ДЕСЯТИЧНЫХ разрядов.
да ARM и софт-float пережует и не поперхнется - о чем вообще речь?! AVR и тот float считает с приемлемой для термометра производительностью, а тут ARM!
Re: Float to String ?
Добавлено: Сб авг 15, 2015 14:29:02
КРАМ
Причем тут производительность АРМа?
Глупости не нужно делать, даже имея высокую производительность.
Аффтар верно думает, что наличие дробной части у чисел - это и есть флоат...

Re: Float to String ?
Добавлено: Сб авг 15, 2015 14:51:15
ARV
я, конечно, не претендую на супергениальность, но с моей точки зрения ARM для того и берут, чтобы получить больше простора за те же деньги - по производительности, объему ОЗУ и ПЗУ вместе с периферией. и все это делаетс ровным счетом только для того, чтобы применять подходы "от большого брата", которые на малоресурсных МК неприменимы. рассуждения по поводу глупостей я считаю "от лукавого", ибо для того и простор, чтобы меньше думать о пути...
Re: Float to String ?
Добавлено: Сб авг 15, 2015 14:56:05
КРАМ
ARV писал(а):для того и простор, чтобы меньше думать о пути...
Думать нужно ВСЕГДА.
Потому что простор рано или поздно закончится (задачи имеют тенденцию к усложнению и ресурсоемкости), а ума при этом не возникнет.
Привычка писать глупый код - это вторая натура.
Re: Float to String ?
Добавлено: Сб авг 15, 2015 15:19:55
ARV
вторая натура (или даже первая) - это постоянно читать нравоучения. а в остальном - каждому своё.
Re: Float to String ?
Добавлено: Сб авг 15, 2015 17:00:58
КРАМ
Re: Float to String ?
Добавлено: Сб авг 15, 2015 17:06:37
Myp3ik
А что это за датчик температуры такой, который выдает результат во Float

?

Re: Float to String ?
Добавлено: Вс авг 16, 2015 07:56:18
КРАМ
Так тож...

Re: Float to String ?
Добавлено: Вс авг 16, 2015 21:42:59
spongebob
Ds18b20 допустим выдает два байта, а из них можно сделать float.
Re: Float to String ?
Добавлено: Вс авг 16, 2015 22:07:54
Аlex
spongebob писал(а):а из них можно сделать float
А зачем ? Чтобы потом, для вывода, переводить обратно ?

Re: Float to String ?
Добавлено: Пн сен 21, 2015 14:57:11
Andrew Martin
Float может понадобиться ежели датчик температуры аналоговый - можно будет калибровать без внешних круток. А так нужно просто задаться необходимой точностью вывода. Если, например, выводить с точностью до десятых, то нужно просто предварительно умножить float число на 10, а потом перевести в целое, а потом уже в строку.
Re: Float to String ?
Добавлено: Пн сен 21, 2015 16:58:49
КРАМ
Andrew Martin писал(а):Float может понадобиться ежели
Чушь.
Флоат нужен тогда и только тогда, когда диапазон чисел этого требует
Иначе гораздо компактнее и проще делать вычисления с фиксированной точкой.
Для датчика температуры диапазон чисел вообще укладывается в пару байт даже с учетом всяких пересчетов.
Re: Float to String ?
Добавлено: Вт сен 22, 2015 15:23:02
Andrew Martin
Чушь?
Ну-ну
Посчитай-ка TRUE RMS по N выборкам из 10ти битного АЦП на целых числах, да c возможностью калибровки константой из EEPROM. Особенно интересно как реализуешь извлечение квадратного корня

Re: Float to String ?
Добавлено: Вт сен 22, 2015 16:42:13
КРАМ
Andrew Martin писал(а):Особенно интересно как реализуешь извлечение квадратного корня

Лови:
Код: Выделить всё
;--- SQRT (W1:W0 -> W0)
sqrt:
mov # 0x8000, W5
clr W6
lp_sq:
ior W6, W5, W6
mul.uu W6, W6, W2
sub W0, W2, W4
subb W1, W3, W4
btss SR, # C
sub W6, W5, W6
lsr W5, W5
bra NC, lp_sq
mov W6, W0
return
Извлечение квадратного корня из 32 разрядного числа.
Вы, любезный не поверите, но я ТОЛЬКО ОДИН РАЗ обратился к флоат, да и то для рекурсивного IIR.
Любой FIR (КИХ) ЛЕГКО считается с фиксированной точкой. Причем скорость вычислений едва ли не на порядок выше, чем у флоата.
Просто нужно коэффициенты окна привести к ЦЕЛЫМ...
Код: Выделить всё
;---------------------------
;--- ФНЧ-17
; прореживание через 7 отсчетов
LPF:
mov # buf_calc, W10
;--- фильтр 17 порядка
mov # psvoffset(tab_FIR), W8
clr B, [W8]+=2, W4, [W10]+=2, W5
do # 31, end_LPF
repeat # 16
mac W4*W5, B, [W8]+=2, W4, [W10]+=2, W5
mov # psvoffset(tab_FIR), W8
mov [W8++], W4
sub W10, # 20, W10
end_LPF: mov [W10++], W5
mov shift_lpf, W0
and # 0b11, W0
mov # 8, W1
sub W1, W0, W0
sftac B, W0
mov ACCBH, W0
btsc ACCBL, # 15
inc W0, W0
mov W0, [W7]
return
;---------------------------
Разрядность аккумулятора 40.
Разрядность массива на входе 16
Разрядность коэффициентов окна 16
ЗЫ. Но это все лирика, ведь речь шла о банальном ТЕРМОМЕТРЕ.
Покажите мне диапазон чисел в термометре, который бы потребовал флоат.

Там даже дробных чисел нет. В принципе.