Float to String ?
- КРАМ
- Друг Кота
- Сообщения: 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 ?
КРАМ писал(а):При КАЖДОМ умножении 16.16*16.16=32.32 округляем до 16.16
Естественно, в умном документе от ARM это тоже написано - результат умножения сдвигать вправо на q двоичных разрядов. У нас то q=16.
Я уже просчитал таблицу и прикинул алгоритм на PureBasic
Предварительно всё работает, осталось только обкатать при разных значениях аргумента (весь диапазон, чтобы не было неожиданностей) и в асм под Cortex-M0 перегнать.
Последний раз редактировалось Andrew Martin Вт окт 27, 2015 13:08:17, всего редактировалось 1 раз.
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: Float to String ?
Алгоритм работает корректно во всём диапазоне аргумента (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
