Math 用TMS320C55X实现反正切
我正在学习用TMS320C55x实现反正切 这是源代码:Math 用TMS320C55X实现反正切,math,assembly,trigonometry,numerical-methods,Math,Assembly,Trigonometry,Numerical Methods,我正在学习用TMS320C55x实现反正切 这是源代码: ;* AR0 assigned to _x ;* AR1 assigned to _r ;* T0 assigned to _nx PSH T3 || BSET FRCT ;fractional mode SUB #1, T0 ;nx-1 MOV T0, BRC0 ;repeat nx times M
;* AR0 assigned to _x
;* AR1 assigned to _r
;* T0 assigned to _nx
PSH T3
|| BSET FRCT ;fractional mode
SUB #1, T0 ;nx-1
MOV T0, BRC0 ;repeat nx times
MOV #2596 << #16, AC3 ; AC3.Hi = C5
MOV #-9464 << #16, AC1 ; AC1.Hi = C3
MOV #32617 << #16, AC2 ; AC2.Hi = C1
*
* Note: loading T3 on the instruction before a multiply that uses it will
* cause a 1-cycle delay.
*
MPYMR T3=*AR0+, AC3, AC0 ; (Prime the Pump)
|| RPTBLOCAL loop1-1
MACR AC0, T3, AC1, AC0
MPYR T3, AC0
||MOV *AR0+, T1 ; (for next iteration)
MACR AC0, T3, AC2, AC0
MPYR T3, AC0
||MOV T1, T3
MOV HI(AC0), *AR1+ ;save result
||MPYR T1, AC3, AC0 ; (for next iteration)
loop1:
POP T3
|| BCLR FRCT ;return to standard C
MOV #0, T0 ;return OK value (no possible error)
|| RET
;* 分配给x的AR0
;* AR1分配给_r
;* T0分配给_nx
PSH T3
||BSET FRCT;分数模
第1分节,T0;nx-1
MOV T0,BRC0;重复nx次
MOV#2596我不遵循汇编代码,但我可以猜测这些神奇的系数来自哪里
代码注释表明,C1
、C3
、C5
是多项式近似的系数,arctan
是一个奇数函数,因此它在0
附近的泰勒展开实际上只有x
的奇数次幂。将泰勒展开式中的C1=32617
与1
进行比较y=x-1/3x^3+1/5x^5-1/7x^7+…
,并给出计算上下文,这进一步表明计算结果按2^15=32768
进行缩放
事实证明,y=(32617x-9464x^3+2596x^5)/32768实际上是区间[-1,1]
上的arctan(x)
的一个相当好的近似值。如下所示(在中验证),近似值的最大绝对误差小于1/1000
,并且在与y=±π/4
相对应的端点x=±1
处可忽略不计,这在图形计算中可能是可取的
至于系数实际上是如何推导出来的,一个粗略的多项式只需使用9个控制点就可以进行最佳拟合,一个多项式y=32613 x-9443 x^3+2573 x^5
,其系数已经接近发布代码中使用的系数。更多的控制点和/或附加条件以最小化端点处的误差将导致略有不同的系数,但如果没有任何关于实际使用的优化标准的文档或线索,很难猜测如何精确匹配代码中的系数
我不知道这个组件。。。所以我只能猜测tan和arctan通常是由或计算的。。。也许你应该把代码对齐一点,让它更可读,描述非标准助记符,甚至把代码转换成等式。。。还有什么数据类型?固定点?