Float to String ?

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25235
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Float to String ?

Сообщение КРАМ »

При КАЖДОМ умножении 16.16*16.16=32.32 округляем до 16.16
Реклама
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Re: Float to String ?

Сообщение Andrew Martin »

КРАМ писал(а):При КАЖДОМ умножении 16.16*16.16=32.32 округляем до 16.16

Естественно, в умном документе от ARM это тоже написано - результат умножения сдвигать вправо на q двоичных разрядов. У нас то q=16.

Я уже просчитал таблицу и прикинул алгоритм на PureBasic :) Хватило даже до 10^2.56, при этом верхняя граница диапазона аргумента сверху 130 000 с копейками - для 16 бит достаточно.

Предварительно всё работает, осталось только обкатать при разных значениях аргумента (весь диапазон, чтобы не было неожиданностей) и в асм под Cortex-M0 перегнать.
Последний раз редактировалось Andrew Martin Вт окт 27, 2015 13:08:17, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Re: Float to String ?

Сообщение Andrew Martin »

Алгоритм работает корректно во всём диапазоне аргумента (1...65535), на ноль есть блокировка.
Вот код функции (может быть кому пригодится).

Код: Выделить всё

;16-bit x = 10*20*lg(A)
;r0 = 16-bit unsigned A (in)
;r0 = 16-bit unsigned x (out)
;r0 = 200*lg(r0)

log10:
	push	{r1-r7,lr}	
	movs	r7,0		;x
	lsls	r2,r0,16	;r2 = r0 shl 16 - convert integer to fixed point 16:16
	beq	.done
	movs	r3,1
	lsls	r3,r3,16	;r3 = 1 shl 16 = 1 in 16:16 format
	adr	r4,.pow10_table
	movs	r5,9		;bit counter
    .next:
	mov	r0,r3
	ldr	r1,[r4]
	adds	r4,4
	bl	umul32x32             ;32*32 = 64-bit result, r0*r1 = r1:r0
	lsrs	r6,r1,16	               ;test bits 63:48
	bne	.below
	lsrs	r0,r0,16	;>>16
	lsls	r1,r1,16
	orrs	r0,r1
	cmp	r2,r0
	blo	.below
	mov	r3,r0
	lsls	r7,r7,1
	movs	r0,1
	orrs	r7,r0
	subs	r5,1
	bge	.next
	b	.done
	
    .below:
	lsls	r7,r7,1
	subs	r5,1
	bge	.next
	
    .done:
	mov	r0,r7
	pop	{r1-r7,pc}

align 4
.pow10_table:
dw	0x016B13F8 	;363.07800293
dw	0x00130DFA 	;19.05460548
dw	0x00045D7B 	;4.36515808
dw	0x000216DC 	;2.08929610
dw	0x00017208 	;1.44543982
dw	0x000133C7 	;1.20226443
dw	0x000118B2 	;1.09647822
dw	0x00010C10 	;1.04712856
dw	0x000105F6 	;1.02329302
dw	0x000102F6 	;1.01157951

Ответить

Вернуться в «ARM»