关于sin用表格计算基本函数的文献参考公式:
sin(x) = sin(Cn) * cos(h) + cos(Cn) * sin(h)
Run Code Online (Sandbox Code Playgroud)
其中x = Cn + h,Cn是针对其恒定sin(Cn)和cos(Cn)已被预先计算并在表中可用的,并且,如果以下半乳糖的方法,Cn已被选择为使得两个sin(Cn)和cos(Cn)密切由浮点数近似.数量h接近0.0.此公式的参考示例是本文(第7页).
我不明白为什么这是有道理的:cos(h)然而,它被计算,对于某些值,至少0.5 ULP可能是错误的h,并且因为它接近1.0,这似乎对结果的准确性有极大的影响.sin(x)以这种方式计算.
我不明白为什么不使用下面的公式:
sin(x) = sin(Cn) + (sin(Cn) * (cos(h) - 1.0) + cos(Cn) * sin(h))
Run Code Online (Sandbox Code Playgroud)
然后两个量(cos(h) - 1.0),并sin(h)可以用,很容易做出准确的,因为它们产生接近零的结果多项式来近似.为价值观sin(Cn) * (cos(h) - 1.0), cos(Cn) * sin(h)并为他们的总和仍然很小,其绝对精度,该总和表示,因此,加入这个量的少量ULPS表达sin(Cn)几乎是正确舍入. …
C++ 17添加十六进制浮点常量(浮点字面值).为什么?几个显示好处的例子怎么样?
我已经在 C 中实现了用单精度(32 位浮点)计算的三角函数(sin、cos、arctan)的一些近似值。它们精确到大约 +/- 2 ulp。
我的目标设备不支持任何<cmath>方法<math.h>。它不提供FMA,而是提供MAC ALU。ALU 和 LU 以 32 位格式进行计算。
我的反正切近似实际上是N.juffa 近似的修改版本,它在整个范围内近似反正切。正弦和余弦函数在 [-pi,pi] 范围内精确度高达 2 ulp。
我现在的目标是为正弦和余弦提供更大的输入范围(尽可能大,最好是 [FLT_MIN,FLT_MAX]),这使我能够减少参数。
我目前正在阅读不同的论文,例如KCNg 的 A RGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit或有关此新参数缩减算法的论文,但我无法从中导出实现。
另外,我想提一下两个涉及相关问题的 stackoverflow 问题:有一种使用 matlab 和 c++ 的方法,它基于我链接的第一篇论文。它实际上使用 matlab、cmath 方法,并将输入限制为 [0,20.000]。另一种已经在评论中提到了。这是一种在 C 中实现 sin 和 cos 的方法,使用了我无法使用的各种 c 库。由于这两篇文章已经有几年的历史了,可能会有一些新的发现。
看起来这种情况下最常用的算法是将 2/pi 的数量精确存储到所需的位数,以便能够准确地进行模计算,同时避免取消。我的设备不提供大型 DMEM,这意味着无法查找具有数百位的大型查找表。该过程实际上在本参考文献的第 70 页上进行了描述,顺便说一句,它提供了许多有关浮点数学的有用信息。
所以我的问题是:是否有另一种有效的方法来减少正弦和余弦的参数以获得单精度,避免使用大的 LUT?上面提到的论文实际上专注于双精度并使用最多 1000 位数字,这不适合我的用例。
实际上我还没有找到任何 C 语言的实现,也没有找到针对单精度计算的实现,我将不胜感激任何类型的提示/链接/示例...