- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在正弦/余弦的许多实现中看到了所谓的扩展模块化精度算法。但这是为了什么?例如在 cephes implemetation ,缩小到[0,pi/4]范围后,他们在做这个模精度运算来提高精度。
下面代码:
z = ((x - y * DP1) - y * DP2) - y * DP3;
其中 DP1、DP2 和 DP3 是一些硬编码系数。如何在数学上找到这些系数?我已经了解 big num 的“模块化扩展算法”的目的,但这里它的确切目的是什么?
最佳答案
在三角函数参数约简的上下文中,您正在查看的是 Cody-Waite 参数约简,本书介绍了一种技术:William J. Cody 和 William Waite,初等函数软件手册, Prentice-Hall, 1980. 尽管 subtractive cancellation,目标是针对达到一定幅度的参数实现准确的简化参数。在中间计算。为此,通过使用递减幅度的多个数的总和,以高于 native 精度表示相关常量(此处:DP1
、DP2
, DP3
), 这样除了最不重要的一个之外的所有中间产品都可以在没有舍入误差的情况下计算。
以 IEEE-754 binary32
(单精度)中 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.8e0eeap-4
,而真实结果是 -0x1.8e0e9d39...p-4
.我们以较大的相对误差和较大的 ulp 误差结束。
我们可以通过使用两步 Cody-Waite 参数约简来解决这个问题。例如,我们可以使用 pio2_hi = 0x1.921f00p+0
和 pio2_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 Transactions on Computers, 58 :1139–1145, 2009。有关使用 fmaf()
的有效示例,您可能需要查看 one of my previous answers 中的代码.
关于c - 正余弦模扩展精度算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42455143/
我有一个例程,它将接受 union 参数 d、theta、a 和 alpha 作为输入,并将生成相应的 4x4 齐次矩阵作为输出。我已经测试了我的矩阵乘法,它确实工作正常。我将从输入中得到 5 个矩阵
我有以下代码使用预先计算的内存表执行 Sin/Cos 函数。在下面的例子中,表格有 1024*128 个项目,涵盖了从 0 到 2pi 的所有 Sin/Cos 值。我知道我可以使用 Sin/Cos 对
问题是不言自明的。我看过几个 pi 的例子,但没有看到 trigo 函数。也许可以使用泰勒级数 as done here但我不完全确定如何在 python 中实现它。特别是如何存储这么多数字。我应该提
我开始学习 Python 中的数学模块,并试图围绕 Python 中的正弦、余弦和正切的三角函数。 我花了一些时间学习更多关于三角学的知识,并了解了直角三角形的基本公式是如何工作的: 正弦函数: si
我一个月前才开始学习这门 C++ 类(class)。现在我被分配去写一个程序来计算这个。我不知道我做错了什么。 #include #include float gatherl1(); float
这个问题在这里已经有了答案: Python cos(90) and cos(270) not 0 (3 个答案) 关闭 9 年前。 有没有办法获得角度(以弧度为单位)的精确正切/余弦/正弦? mat
这个问题在这里已经有了答案: Java Math.cos(Math.toRadians()) returns weird values (4 个答案) 关闭 10 年前。 我正在编写一个程序,我必须
我做了一个简单的计算器作为我的第一个android程序,现在我想给它添加trigonometry,log等函数。在 C 中,我们必须包含 math library 才能这样做,我似乎无法弄清楚你是如何
我正面临 objective-c 中 cos 函数的奇怪问题。我安装了带有 iOS 4.3 SDK 的 xcode 4.1.1。 我正在计算一个数的余弦值: y= cos(x*M_PI/180) 这将
尝试将以下 php 方法转换为在 .less 样式表中使用: 在 Less 中,如何在不使用特定语言的 cos()/sin() 函数的情况下实现正弦/余弦方法? .rotate(@deg) {
可以使用 iPhone 3GS 或 Pandora 的人请测试我刚刚编写的以下组装程序吗? 它应该在 NEON 矢量 FPU 上非常快速地计算正弦和余弦。我知道它编译得很好,但没有足够的硬件我无法测试
我为泰勒级数编写了以下函数来计算余弦。 double cosine(int x) { x %= 360; // make it less than 360 double rad = x
我是一名优秀的程序员,十分优秀!