Страница 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
КРАМ
А на хрена, извините, температуру считать во флоатах?
:shock:
32-разрядный МК реализует в ЦЕЛЫХ числах (фиксированная точка) аж 9,5 ДЕСЯТИЧНЫХ разрядов.
Это какую точность-разрешение нужно иметь у датчика температуры? :dont_know:
:))) :))) :)))

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
КРАМ
Причем тут производительность АРМа?
Глупости не нужно делать, даже имея высокую производительность.
Аффтар верно думает, что наличие дробной части у чисел - это и есть флоат...
:tea:

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
КРАМ
:))) :tea:

Re: Float to String ?

Добавлено: Сб авг 15, 2015 17:06:37
Myp3ik
А что это за датчик температуры такой, который выдает результат во Float :shock: ? :)))

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 разрядного числа.
:tea:
Вы, любезный не поверите, но я ТОЛЬКО ОДИН РАЗ обратился к флоат, да и то для рекурсивного 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

ЗЫ. Но это все лирика, ведь речь шла о банальном ТЕРМОМЕТРЕ.
Покажите мне диапазон чисел в термометре, который бы потребовал флоат.
:))) :))) :)))
Там даже дробных чисел нет. В принципе.