use*_*732 1 verilog hdl cordic
我无法理解计算范围 [-1, 1) 之外的数字的指数背后的数学原理(实际上我不确定使用 CORDIC 计算 exp 的最佳范围是什么,我在某个地方读过 [-pi/4, pi/4] 和其他人我读过 [-1, 1)) 使用 CORDIC 算法。有人可以举个例子吗?
\n\n我在http://zone.ni.com/reference/en-XX/help/371599G-01/lvfpga/ht_exponential/阅读了以下声明:
\n\n“x 必须在 [\xe2\x80\x931, 1) 范围内。要在 x 超出此范围时计算 exp(x),请找到一个整数 q 和一个实数 r,其中 r 在 [0, ln(2)),使得 x = q \xc3\x97 ln(2) + r。然后您可以计算 2^q \xc3\x97 exp(r),这相当于 exp(x)。因为 r 是在[\xe2\x80\x931, 1)的有效范围内,可以使用该函数计算exp(r)。"
\n\n但如何找到 q 和 r 对我来说没有多大意义?
\n\n我发现的第二种方法是在http://www.xilinx.com/support/documentation/application_notes/xapp552-cordic-floating-point-operations.pdf,它告诉我们在将数字分为整数和小数部分后使用方程:
\n\ncosh(int + frac) = cosh(int) * cosh(frac) + sinh(int) * sinh(frac)\nsinh(int + frac) = cosh(int) * sinh(frac) + cosh(frac) * sinh(int)\nRun Code Online (Sandbox Code Playgroud)\n\ncosh(int) 和 sinh(int) 取自查找表。但这种方法的计算量更大,所以我更喜欢前一种方法。
\n如果x = q \xc3\x97 ln(2) + r那么
exp(x) = exp(q \xc3\x97 ln(2) + r)\n = exp(ln(2))^q exp(r)\n = 2^q exp(r)\nRun Code Online (Sandbox Code Playgroud)\n\n这意味着,如果你能找到q并且r很容易找到指数,你只需要位移 2 ( 2<<(q-1)) 找到exp(r)并将它们相乘即可。
找到q并r首先记下ln(2)=0.6931471805599453。如果您有可用的分区
q = floor( x / ln(2) )\nr = x - q * ln(2)\nRun Code Online (Sandbox Code Playgroud)\n\n如果你没有除法,你可以使用循环
\n\nq = 0\nwhile( x > ln(2) ) {\n x -= ln(2)\n ++q\n}\nr = x\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2580 次 |
| 最近记录: |