我正在实现sin三角函数的CORDIC算法.为了做到这一点,我需要硬编码/计算一堆反正切值.现在我的功能似乎可以工作(由Wolfram Alpha验证)到打印的精度,但我希望能够打印我的所有32位精度f32.我该怎么办?
fn generate_table() {
let pi: f32 = 3.1415926536897932384626;
let k1: f32 = 0.6072529350088812561694; // 1/k
let num_bits: uint = 32;
let num_elms: uint = num_bits;
let mul: uint = 1 << (num_bits - 2);
println!("Cordic sin in rust");
println!("num bits {}", num_bits);
println!("pi is {}", pi);
println!("k1 is {}", k1);
let shift: f32 = 2.0;
for ii in range(0, num_bits) {
let ipow: f32 = 1.0 / shift.powi(ii as i32);
let cur: …Run Code Online (Sandbox Code Playgroud) 我无法理解计算范围 [-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) * …Run Code Online (Sandbox Code Playgroud)