我已经在这个架构的软件中实现了32位单精度浮点加法/减法,乘法,余弦,正弦,除法,平方根和范围缩减.
为了实现余弦和正弦,我首先使用文章“ARGUMENT REDUCTION FOR HUGE ARGUMENTS” by K.C. NG中描述的方法使用范围缩小
然后我实现了余弦和正弦函数,它们是-pi / 4到pi / 4范围内的余弦和正弦函数的多项式近似.我提到了“计算机近似”一书,Hart等人.对于多项式.
我也听说过我应该考虑CORDIC算法.但是,我想知道是否有人知道它是否会比我已经使用的方法更高效或更低效(在吞吐量,内存开销和所需指令数方面)?我已经在多核架构上实现了我的软件功能,其中每个核心仅具有128个字的指令存储器和128个字的16位数据存储器.
我也尝试过搜索如何为余弦和正弦实现CORDIC算法,但我找不到任何用于32位浮点实现的好资源.有人有建议吗?
谢谢!
解决方法
重新评论:Horner’s method是通过重复添加系数,然后乘以变量x,从最高阶系数到最低系数来评估多项式的实践.相比之下,天真的方法(即首先评估x的幂,然后将它们乘以它们的系数并将它们加在一起)需要更多的工作,并且可以比Horner的方法在数值上更不稳定.
您还没有完全提到您是如何评估多项式的,所以我建议一个公式:
x2 = x * x cos = ((COS_D * x2 + COS_C) * x2 + COS_B) * x2 + COS_A sin = (((SIN_D * x2 + SIN_C) * x2 + SIN_B) * x2 + SIN_A) * x
请注意,如果将常量调整到评估函数的范围,而不是使用泰勒系数,则可以获得更好的精度. (再次,如果你已经完成了部分或全部这些事情,请道歉,但你没有提到你已经尝试过的东西……)
这可能与您的情况(可能只有16×16位MAC)相关性较小,但如果您的处理器可以同时启动多个算术评估,那么如果您在树状结构中编写评估,则可能会获得更好的性能.形式,避免一些操作的顺序依赖:
x2 = x * x x4 = x2 * x2 cos = (COS_D * x2 + COS_C) * x4 + (COS_B * x2 + COS_A) sin = ((SIN_D * x2 + SIN_C) * x4 + (SIN_B * x2 + SIN_A)) * x
如果你的处理器有一个矢量ALU,这个公式也建议它有效地使用……