当前位置: 首页 > 知识库问答 >
问题:

正余弦模扩展精度算法

沈思博
2023-03-14

我在许多正弦/余弦的应用中都看到了一种所谓的扩展模精度算法。但这是为了什么?例如,在cephes实验中,在缩小到[0,pi/4]范围后,他们正在进行这种模块化精度算法来提高精度。

守则如下:

z = ((x - y * DP1) - y * DP2) - y * DP3;

其中DP1、DP2和DP3是一些硬编码系数。如何从数学上求出这些系数?我已经理解了“模块扩展算术”对于big num的目的,但是这里它的确切目的是什么呢?

共有1个答案

扈昀
2023-03-14

在三角函数的变元约简方面,你所看到的是Cody-Waite变元约简,一种在书中介绍的技术:William J.Cody和William Waite,《初等函数软件手册》,Prentice-Hall,1980。其目标是,对于达到一定幅度的参数,尽管在中间计算中进行减法抵消,但仍实现精确的缩减参数。为此,通过使用幅度递减的多个数字(这里:dp1dp2dp3)的和来表示相关常数,从而可以计算除最低有效值外的所有中间乘积,而不会产生舍入误差。

以IEEE-754binary32(单精度)中的sin(113)计算为例。典型的参数约简在概念上计算i=rintf(x/(π/2));reduced_x=x-i*(π/2)。最接近π/2的binary32数字是0x1.921fb6p+0。我们计算i=72,乘积循环到0x1.C463ACP+6,它接近参数x=0x1.C40000P+6。在减法过程中,一些前导位被取消,最后我们得到reduced_x=-0x1.8eb000p-4。注意重整化引入的尾随零点。这些零位不携带有用的信息。对简化的参数应用精确的近似值,sin(x)=-0x1.8e0eap-4,而真正的结果是-0x1.8e0e9d39.p-4。我们得到了较大的相对误差和较大的ulp误差。

我们可以通过使用两步Cody-Waite变元约简来弥补这一点。例如,我们可以使用PIO2_HI=0x1.921F00P+0PIO2_LO=0x1.6A8886P-17。请注意pio2_hi单精度表示中的八个尾随零位,它们允许我们与任何8位整数i相乘,并且乘积i*pio2_hi仍然可以精确表示为单精度数字。当我们计算((x-i*pio2_hi)-i*pio2_lo)时,我们得到reduced_x=-0x1.8eafb4p-4,因此sin(x)=-0x1.8e0e9ep-4,这是一个非常准确的结果。

将常数拆分为和的最佳方法取决于我们需要处理的i的大小、在给定参数范围内进行减法抵消的最大位数(基于π/2的整数倍数与整数的接近程度)以及性能考虑。典型的实际用例涉及两到四个阶段的Cody-Waite缩减方案。融合多重加(FMA)的可用性允许使用具有较少尾随零位的组成常数。参见本文:Sylvie Boldo,Marc Daumas和Ren-Cang Li,“用融合乘法-加法正式验证论证缩减”。计算机上的IEEE交易,58:1139-1145,2009。对于使用fmaf()的工作示例,您可能希望查看我前面的一个答案中的代码。

 类似资料:
  • 问题内容: 假设您在数据库中按以下方式构造了一个表: 为了清楚起见,应输出: 请注意,由于向量存储在数据库中,因此我们仅需要存储非零条目。在此示例中,我们只有两个向量$ v_ {99} =(4,3,4,0)$和$ v_ {1234} =(0,5,2,3)$都在$ \ mathbb {R}中^ 4 $。 这些向量的余弦相似度应为$ \ displaystyle \ frac {23} {\ sqrt

  • 问题内容: 我计算了两个文档的tf / idf值。以下是tf / idf值: 这些文件就像: 如何使用这些值来计算余弦相似度? 我知道我应该计算点积,然后找到距离并除以点积。如何使用我的值来计算? 还有一个问题: 两个文档的字数相同是否重要? 问题答案: a * b是点积 一些细节: 是。在某种程度上,a和b必须具有相同的长度。但是a和b通常具有稀疏表示,您只需要存储非零条目,就可以更快地计算范数

  • 我目前正在研究余弦的近似值。由于最终的目标设备是一个使用32位浮点ALU/LU的自开发设备,并且有一个专门的C编译器,所以我不能使用C库的数学函数(cosf,...)。我的目标是编写在精度和指令/周期数量方面不同的各种方法。 我已经尝试了很多不同的近似算法,从fdlibm开始,taylor展开,pade近似,remez算法使用maple等等.... 但是一旦我只使用浮点精度来实现它们,精度就会有很

  • /编辑:很抱歉缺少一个问题。我需要知道如何使用正弦和余弦来画一个正方形或矩形,旋转中心在正方形或矩形的左上角。用角度的sin和cos得到坐标(x1,y1),然后用角度的sin和cos函数加上90度得到坐标(x2,y2)。使用计数器变量从左到右,从上到下绘制线条,随角度变化。

  • 问题内容: 如何找到向量之间的余弦相似度? 我需要找到相似性来衡量两行文本之间的相关性。 例如,我有两个句子: 用户界面系统 用户界面机 …及其在tF-idf之后的向量,然后使用LSI进行标准化,例如 和。 如何测量这些向量之间的相似性? 问题答案: 我最近在大学的信息检索部门做了一些tf-idf的工作。我使用了这种余弦相似度方法,该方法使用Jama:Java Matrix Package 。 有

  • 我们使用余弦相似度来计算两个物品的距离。我们在第二章中提过“分数膨胀”现象,因此我们会从用户的评价中减去他所有评价的均值,这就是修正的余弦相似度。 左:我喜欢Phoenix乐队,因此给他们打了5分。我不喜欢Passion,所以给了3分。 右:Phoenix很棒,我给4分。Passion Pit太糟糕了,必须给0分! U表示同时评价过物品i和j的用户集合 这个公式来自于一篇影响深远的论文《基于物品的