4

我在哪里可以找到有关 x86 处理器上三角函数指令的错误范围的信息,例如fsincos

4

3 回答 3

7

你问的问题很少是一个有趣的问题,而且很可能你真的想知道一些不同的东西。所以让我先回答不同的问题:

如何计算一定精度的三角函数?

只需使用更长的数据类型。使用 x86,如果您需要双精度的结果,请进行 80 位扩展双精度计算,这样您就安全了。

如何获得与平台无关的准确性?

您需要专门的软件解决方案,例如MPFR

也就是说,让我回到你原来的问题。简短的回答:对于小操作数,它通常应该在 1 ulp 以内。对于更大的操作数,情况会变得更糟。唯一确定的方法就是自己测试一下,就像这个人一样。没有来自处理器供应商的可靠信息。

于 2014-02-20T14:05:23.433 回答
3

对于 Intel CPU,内置先验指令的准确性记录在Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 1 , section 8.3.10 Transcendental Instruction Accuracy:

对于 Pentium 处理器和更高版本的 IA-32 处理器,超越函数的最坏情况错误在舍入到最接近(偶数)时小于 1 ulp,而在其他模式下舍入时小于 1.5 ulp。

应该注意的是,1 ulp的误差范围适用于 80 位扩展精度格式,因为所有超越函数指令都提供扩展精度结果。Stephen Cannon 在较早的评论中指出的关于三角函数指令 FSIN、FCOS、FSCINCOS、FPTAN 的准确性损失的问题,由于使用 66 位机器 PI 减少了参数,得到了以下人员的承认英特尔。提供如下指导:

无论目标精度如何(单精度、双精度或双扩展),将参数减小到绝对值小于 FSIN 的约 3π/4 以及 FCOS、FSINCOS 的小于约 3π/8 的值是安全的。和 FPTAN。[...] 例如,精度测量表明 FSIN 的双扩展精度结果对于 |x| 的误差不会大于 0.72 ulp。< 2.82 [...] 同样,FCOS 的双扩展精度结果对于 |x| 的误差不会大于 0.82 ulp。< 1.31 [...]

进一步承认,对数函数指令 FYL2X 和 FYL2XP1 的 1 ulp 错误界限仅在 y = 1 时成立(这在英特尔的一些旧文档中并不清楚):

FYL2X 和 FYL2XP1 指令是两条操作数指令,只有在 y 等于 1 时才保证在 1 ulp 以内。当 y 不等于 1 时,最大 ulp 误差始终在 1.35 以内

使用多精度库,可以直接对英特尔的声明进行测试。为了收集以下数据,我使用了 Richard Brent 的 MP 库作为参考,并在指定的时间间隔内运行了 2 31个随机测试用例:

Intel Xeon CPU E3-1270 v2 "IvyBridge", Intel64 Family 6 Model 58 Stepping 9, GenuineIntel

2xm1 [-1,1]        max. ulp = 0.898306 at x = -1.8920e-001 (BFFC C1BED062 C071D472)
sin [-2.82,+2.82]  max. ulp = 0.706783 at x =  5.1323e-001 (3FFE 8362D6B1 FC93DFA0)
cos [-1.41,+1.41]  max. ulp = 0.821634 at x = -1.3201e+000 (BFFF A8F8486E 591A59D7)
tan [-1.41,+1.41]  max. ulp = 0.990388 at x =  1.3179e+000 (3FFF A8B0CAB9 0039C790)
atan [-1,1]        max. ulp = 0.747328 at x =  1.2252e-002 (3FF8 C8BB9E06 B9EB4DF8), y =  3.9204e-001 (3FFD C8B8DC94 AA6655B4)
y2lx [0.5,2.0]     max. ulp = 0.994396 at x =  1.0218e+000 (3FFF 82C95B56 8A70EB2D), y =  1.0000e+000 (3FFF 80000000 00000000)
yl2x [1.0,1.2]     max. ulp = 1.202769 at x =  1.0915e+000 (3FFF 8BB70F1B C5F7E103), y = -9.8934e-001 (BFFE FD453A23 AC926478)
yl2xp1 [-0.7,1.44] max. ulp = 0.990469 at x =  2.1709e-002 (3FF9 B1D61A98 BF349080), y =  1.0000e+000 (3FFF 80000000 00000000)
yl2xp1 [-1, 1]     max. ulp = 1.206979 at x =  9.1169e-002 (3FFB BAB69127 C1D5C158), y = -9.9281e-001 (BFFE FE28A91F 132F0C35)

虽然这种非详尽的测试无法证明错误界限,但发现的最大错误似乎证实了英特尔的文档。

我没有任何现代 AMD 处理器要测试,但有旧的 32 位 Athlon CPU 的测试数据。全面披露:我为 32 位 Athlon 处理器中使用的超越函数指令设计了算法。对于所有指令,我的准确度目标都小于 1 ulp;但是,对于上面已经提到的三角函数,关于通过 66 位机器 PI 减少参数的相同警告也适用。

Athlon XP-2100 "Palomino", x86 Family 6 Model 6 Stepping 2, AuthenticAMD

2xm1 [-1,1]        max. ulp = 0.720006 at x =  5.6271e-001 (3FFE 900D9E90 A533535D)
sin [-2.82, +2.82] max. ulp = 0.663069 at x = -2.8200e+000 (C000 B47A7BB2 305631FE)
cos [-1.41, +1.41] max. ulp = 0.671089 at x = -1.3189e+000 (BFFF A8D0CF9E DC0BCA43)
tan [-1.41, +1.41] max. ulp = 0.783821 at x = -1.3225e+000 (BFFF A947067E E3F4C39C)
atan [-1,1]        max. ulp = 0.665893 at x =  5.5333e-001 (3FFE 8DA6B606 C58B206A) y =  5.5169e-001 (3FFE 8D3B9DC8 5EA87546)
yl2x [0.4,2.5]     max. ulp = 0.716276 at x =  6.9826e-001 (3FFE B2C128C3 0EF1EC00) y = -1.2062e-001 (BFFB F7064049 BC362838)
yl2xp1 [-1,4]      max. ulp = 0.691403 at x =  1.9090e-001 (3FFC C37C0397 F8184934) y = -2.4796e-001 (BFFC FDE93CA9 980BF78C)

AMD64 架构程序员手册,卷1,在第 6.4.5.1 节超越结果的准确性中,记录了误差范围如下:

x87 计算以双扩展精度格式执行,因此超越函数为每种浮点数据类型提供精确到最后一位 (ulp) 单位的结果。

于 2017-01-13T05:48:49.587 回答
2

您可以阅读英特尔® 64 和 IA-32 架构开发人员手册:卷。1第 8.3.10 节关于先验指令的准确性。有一个精确的公式,但也有更通俗易懂的说法

对于 Pentium 处理器和更高版本的 IA-32 处理器,超越函数的最坏情况错误在舍入到最接近(偶数)时小于 1 ulp,而在其他模式下舍入时小于 1.5 ulp。

于 2014-02-20T14:01:58.797 回答