[an error occurred while processing this directive]
|
Все в Q15
вычисляем вот это result=(1-x)^(4/3) // a1 - split to 2 part
E-mail:
info@telesys.ru
0
// calculation only up to power 8! - it is enought!
int const a_i[16+1] = {
+32767, //a0=+1 ну почти !
-21845, //a1= -21845.33 -1.333333333333333e+000/2 = -0.6666666666666665
+7282, //a2= +7281.78 +2.222222222222222e-001
+1618, //a3= +1618.17 +4.938271604938271e-002
+674, //a4= +674.24 +2.057613168724280e-002
+360, //a5= +359.59 +1.097393689986283e-002
+220, //a6= +219.75 +6.706294772138394e-003
+147, //a7= +146.50 +4.470863181425595e-003
+104, //a8= +103.77 +3.166861420176464e-003
а вот прога
T0=x
; --- tylor loop a8..a0---
mov #8-1-1,brc0 ; loop counter:
amov #_a_i+8,XAR0 ; xar0=&a_8 point to last coeff
mov *AR0- << #16,AC0 ; AC0 = a_8 ; AR0--
rptbLocal requantizeTylorLoop-1
mov *AR0- << #16,AC1 ; AC1 = a_i ; AR0--
mac AC0, T0, AC1, AC0 ; AC0=AC0*x+a_i
requantizeTylorLoop:
mpy T0,AC0 ; AC0=AC0*x
; a_1 - twice so +1 one time
mac AC1,T0,AC0,AC0 ; AC0=AC0+AC1*T0
; --- last 1 ---
add *AR0 << #16, AC0 ; AC0=AC0+a0
add #1 << #16, AC0 ; AC0=AC0+1 ????
add #7fffh, AC0 ; AC0=AC0+0.5 round up
; --- result --- ; ??? -0x7fff - it is not exactly 1 so last bit
mov Hi(AC0),T0
ошибка меньше млдашего бита на всем интервале x.
Ответы