Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 三角函数的值域约化_Algorithm_Math_Trigonometry - Fatal编程技术网

Algorithm 三角函数的值域约化

Algorithm 三角函数的值域约化,algorithm,math,trigonometry,Algorithm,Math,Trigonometry,我正在尝试实现三角函数的范围缩减。 我找到了这篇关于使用64位整数算法的论文 提出的想法应该行得通,但论文中的方程似乎存在一些问题。 这比在fdlibm中实现的有效吗?如果您想执行完整的浮点范围缩减,请参考K.C.Ng的“大参数的参数缩减:好到最后一位”在web上很容易找到 突出的问题是,要对标准trig函数(如正弦(x))进行范围缩减,其中x以弧度表示,必须进行精确的mod操作,包括Pi。mod需要将4/Pi扩展到足够多的派系位,以获得有意义的结果。本文详细介绍了这一过程以及需要走多远。事实证

我正在尝试实现三角函数的范围缩减。 我找到了这篇关于使用64位整数算法的论文

提出的想法应该行得通,但论文中的方程似乎存在一些问题。
这比在fdlibm中实现的有效吗?

如果您想执行完整的浮点范围缩减,请参考K.C.Ng的“大参数的参数缩减:好到最后一位”在web上很容易找到


突出的问题是,要对标准trig函数(如正弦(x))进行范围缩减,其中x以弧度表示,必须进行精确的
mod
操作,包括Pi。
mod
需要将4/Pi扩展到足够多的派系位,以获得有意义的结果。本文详细介绍了这一过程以及需要走多远。事实证明,它是潜在的100位,但不是数百万位。您可能知道这个问题,但如果不知道,您需要知道如何使用64位例程或其他方法进行良好的缩减。

您说“论文中的公式似乎有问题”-有什么问题?我无法阅读链接中引用的论文;在付费墙后面。你能改写这个问题,让其他(非学术)人有可能回答你的问题吗?在什么非人为的情况下,“超精确”三角范围缩减真的有用吗?当然,在我所看到的大多数trig函数的使用案例中,参数的计算需要乘以分数884279719003555/281474976710656(最接近于π的
double
或使用该分数计算的其他值。如果使用Math.PI执行参数缩减,则类似于
Math.sin(Math.PI/180.0*x)
的表达式会将180°的自转角报告为零;使用π进行变元缩减并不能提高精度。在大变元的变元缩减中提出的“超精确”三角范围缩减的一个理由是:好到最后一位是,实现函数(如
sine(double x)
)不知道精度需要。使用函数(如sqrt())编写代码时,不要期望得到许多ULP关闭的答案,而是可能的最佳答案。与wise中的
sine()
一样,所讨论的方法提供了一种在整个
x
范围内提供高精度的方法。大多数应用程序不需要这样做。本文讨论了更合理的问题,建议阅读它以获得更好的答案。@supercat”表达式,如Math.sin(Math.PI/180.0*x),如果使用Math.PI执行参数缩减,则会将180°的自(sic)报告为零:True。但这不是最好的答案,因为
Math.sin(Math.PI)
不是0.0。e、 g.
sin(我的系统上的3.14159265358979311600/*Math.PI*/)-->1.224647e-16
1.224647e-16
与0.0的绝对值相差很小,但由于FP是典型的对数分布,它比0.0要好得多。如果将某个值乘以一个被认为[但不能]等于π的常数来计算
sin
的参数,如果使用乘法中被认为是π的任何值来执行范围缩减,则将获得最佳精度。假设8087有一条指令加载一个值为π的寄存器,该值精确到64位,它将使用该64位值执行范围缩减。当与值乘以52位近似值pi的代码一起使用时,可通过对该值执行范围缩减来获得最佳精度。
Math.Sin(180.0*(Math.pi/180.0))
不是零这一事实应归类为可容忍的怪癖,而不是特征,因为180°的正弦不是1.224647e-16,但应该精确地为零。此外,除非代码碰巧知道sine的参数表示精确值,而不是+/-0.0000000000000000 1%(ulp的1/1000),否则sin(x)的任何报告值(介于0.99999999999999999x的正弦值和1.0000000000000000001x的正弦值之间)应视为与任何其他值一样好。除非参数是用Kahan求和计算的。。。