我正在尝试将范围缩减作为实现正弦函数的第一步.
当使用0到20000的输入范围时,我得到的误差大到0.002339146.我的错误显然不应该那么大,我不知道如何减少它.我注意到误差幅度与输入θ幅度与余弦/正弦相关.
我能够获得本文提到的nearpi.c代码,但我不确定如何将代码用于单精度浮点.如果有人有兴趣,可以在以下链接找到nearpi.c文件:nearpi.c
这是我的MATLAB代码:
x = 0:0.1:20000;
% Perform range reduction
% Store constant 2/pi
twooverpi = single(2/pi);
% Compute y
y = (x.*twooverpi);
% Compute k (round to nearest integer
k = round(y);
% Solve for f
f = single(y-k);
% Solve for r
r = single(f*single(pi/2));
% Find last two bits of k
n = bitand(fi(k,1,32,0),fi(3,1,32,0));
n = single(n);
% Preallocate for speed
z(length(x)) = 0;
for i = 1:length(x)
    switch(n(i)) …我试图在MATLAB中使用remez交换算法找到正弦和余弦的minimax多项式近似.因为我正在实现IEEE-754浮点的正弦和余弦函数,所以需要精度到23位.
在这里使用此链接(参见第8页到第15页),给出了使用Mathematica和Maple查找多项式的指令,但是,我不确定如何为MATLAB推断这些方法.
根据表3,我需要使用5阶或6阶多项式来获得~23位(小数点后)的精度.
我计划首先将所有输入θ的范围缩小到-pi/4到+ pi/4之间,然后根据需要执行正弦或余弦函数(最终目标是实现exp(i*x)= cos( x)+ i*sin(x).
我也许可以自己遵循本文的说明,但我不知道如何在这里使用remez函数.另外,我不遵循为什么作者使用等式(6)(第9页),也不理解k的等式(第11页)是如何确定的(2796201来自哪里?)为什么定义我们希望最终改变为sin9x的多项式的形式= x + kx ^ 3 + x ^ 5*P(x ^ 2).
是否更好地使用firpm函数(因为remez已被弃用)?
谢谢,非常感谢所有帮助和指导,以及编辑,以确保我的问题可能得到最好的答案.