微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.
>我的功能永远不会慢一点,即使是强硬的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.然后绝对误差会更大,但你会保存一个乘法或两个.

原文地址:https://www.jb51.cc/c/111192.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐