我习惯于在C中进行编码,并进行一些asm优化,因此任何适合于从C开始到C到asm的管道将适用于我.
谢谢.
我现在在Linux 64位,gcc和clang(甚至坚韧的clang并不提供任何与FPU相关的优化AFAIK).
编辑
>我已经实现了一个sin函数,它通常是std :: sin的2倍,即使是sse.
>我的功能永远不会慢一点,即使是强硬的fins通常更准确,但考虑到fsin永远不会胜过我的罪恶的执行,我现在将保持我的罪恶,我的罪是完全可移植的,fsin仅用于x86.
>我需要这个实时计算,所以我会交易精度的速度,我觉得我会罚款的精确度为4-5位小数.
>不要以表为基础的方法,我没有使用它,它拧紧缓存,使一切都更慢,没有基于内存访问或查找表的算法.
解决方法
x *(1×* x *(-0.1661251158026961831813227851437597220432 x * x *(8.03943560729777481878247432892823524338e-3 x * x * -1.4941402004593877749503989396238510717e-4))
它可以实现:
float xx = x * x; float s = x + (x * xx) * (-0.16612511580269618f + xx * (8.0394356072977748e-3f + xx * -1.49414020045938777495e-4f));
也许是optimized depending on the characteristics of your target architecture.另外,在链接的博客文章中没有注明,如果要在程序集中实现,请使用FMADD指令.如果在C或C中实现,如果使用fmaf()C99标准函数,请确保生成FMADD.仿真版本比乘法和加法要贵得多,因为fmaf()的作用并不完全等同于后面加上的乘法(因此实现它并不正确).
sin(x)与-π和π图之间的上述多项式之间的差异如此:
多项式被优化以减少它与-π和π之间的sin(x)之间的差异,而不仅仅是有人认为是一个好主意.
如果您只需要[-1 … 1]定义间隔,则可以通过忽略其余部分在该间隔上使多项式更准确.为此定义间隔再次运行the optimization algorithm产生:
x *(1×* x *(-1.666659904470566774477504230733785739156e-1 x * x *(8.329797530524482484880881032235130379746e-3 x * x *( – 1.928379009208489415662312713847811393721e-4)))
绝对误差图:
如果这对你来说太准确了,可以到optimize a polynomial of lower degree for the same objective.然后绝对误差会更大,但你会保存一个乘法或两个.