Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 用TMS320C55X实现反正切_Math_Assembly_Trigonometry_Numerical Methods - Fatal编程技术网

Math 用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

我正在学习用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
        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通常是由或计算的。。。也许你应该把代码对齐一点,让它更可读,描述非标准助记符,甚至把代码转换成等式。。。还有什么数据类型?固定点?