加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 对于Intel asm来说,速度更快但不太准确?

发布时间:2020-12-16 03:32:51 所属栏目:百科 来源:网络整理
导读:由于用于计算x86下的sin(x)函数的函数fsin可追溯到奔腾时代,并且显然它甚至不使用SSE寄存器,所以我想知道是否有更新更好的计算三角函数的指令集. 我习惯于在C中进行编码,并进行一些asm优化,因此任何适合于从C开始到C到asm的管道将适用于我. 谢谢. 我现在在Li
由于用于计算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.然后绝对误差会更大,但你会保存一个乘法或两个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读