c – 对于Intel asm来说,速度更快但不太准确?
由于用于计算x86下的sin(x)函数的函数fsin可追溯到奔腾时代,并且显然它甚至不使用SSE寄存器,所以我想知道是否有更新更好的计算三角函数的指令集.
我习惯于在C中进行编码,并进行一些asm优化,因此任何适合于从C开始到C到asm的管道将适用于我. 谢谢. 我现在在Linux 64位,gcc和clang(甚至坚韧的clang并不提供任何与FPU相关的优化AFAIK). 编辑 >我已经实现了一个sin函数,它通常是std :: sin的2倍,即使是sse. 解决方法
如果您需要对绝对精度超过π…进行优化的正弦近似,请使用:
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.然后绝对误差会更大,但你会保存一个乘法或两个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |