You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中生成CORDIC算法所需的K值序列?

C语言中正确生成CORDIC算法K值的方法

我正尝试用C语言实现CORDIC算法,需生成该算法用到的常数值。反正切值列表的生成很顺利,但生成第二组“K值”时遇到困难。

给出的Matlab参考代码为:

% Kvalues = cumprod(1./sqrt(1 + 1j*2.^(-(0:23))))
Kvalues = [ ...
   0.70710678118655   0.63245553203368   0.61357199107790   0.60883391251775 ...
   0.60764825625617   0.60735177014130   0.60727764409353   0.60725911229889 ...
   0.60725447933256   0.60725332108988   0.60725303152913   0.60725295913894 ...
   0.60725294104140   0.60725293651701   0.60725293538591   0.60725293510314 ...
   0.60725293503245   0.60725293501477   0.60725293501035   0.60725293500925 ...
   0.60725293500897   0.60725293500890   0.60725293500889   0.60725293500888 ];

因对该写法不熟悉,我难以推导出生成相同结果的简单公式,且不想直接粘贴数值,希望自行生成对应精度的K值。

我尝试的C代码如下,但结果不正确:

float prev = 1;
for (int i = 0; i < PRECISION; i++)
    printf("%f\n", prev = prev/sqrt(1+pow(2, -i)));

我期望得到维基百科中的结果:

0.707106
0.632455
0.613571
0.608833
0.607648
0.607351

但我的代码生成结果收敛于0.457942...而非0.607252...:

0.707107
0.577350
0.516398
0.486864
0.472328
0.465116

请问在C语言中生成指定精度的CORDIC算法K值的正确公式是什么?


错误原因与修正公式

你的代码错误在于分母的计算:Matlab代码里的1j*2.^(-n)是复数,其模长的平方是1 + (2^-n)^2,也就是1 + 2^(-2n),而非你代码里的1 + 2^(-n)。

CORDIC的K值是累积乘积,每一步的因子是1 / sqrt(1 + (2^-i)^2),对应的正确公式为:

prev = prev / sqrt(1 + pow(2, -2*i));

正确的C代码实现

使用双精度浮点数可以获得更高精度,避免单精度float的误差:

#include <stdio.h>
#include <math.h>

#define PRECISION 24

int main() {
    double prev = 1.0;
    for (int i = 0; i < PRECISION; i++) {
        prev /= sqrt(1.0 + pow(2.0, -2.0 * i));
        printf("%.6f\n", prev);
    }
    return 0;
}

验证结果

运行上述代码,前6个结果与维基百科完全一致:

0.707107
0.632456
0.613572
0.608834
0.607648
0.607352

最终结果会收敛到0.60725293500888...,与Matlab给出的K值完全匹配。


内容的提问来源于stack exchange,提问作者CPlus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:30:01