Floating point AMD处理器上FSIN和其他x87三角指令的精度

Floating point AMD处理器上FSIN和其他x87三角指令的精度,floating-point,trigonometry,floating-accuracy,amd-processor,x87,Floating Point,Trigonometry,Floating Accuracy,Amd Processor,X87,在英特尔处理器上,即使计算本身精确到80位扩展精度浮点值的完整64位尾数。(所有有效输入的完全准确度要求pi的128位近似值。)Intel文档中的遗漏是在该问题引起他们的注意之后出现的 然而,除了以下内容之外,我找不到关于AMD执行x87三角指令准确性的类似详细信息: 6.4.5.1超越结果的准确性 x87计算以双扩展精度格式执行,因此超越函数为每种浮点数据类型提供精确到最后一位一个单位(ulp)以内的结果 对于所有有效输入,包括128位或更高的pi近似值,AMD对x87三角指令的实现是否真的完

在英特尔处理器上,即使计算本身精确到80位扩展精度浮点值的完整64位尾数。(所有有效输入的完全准确度要求pi的128位近似值。)Intel文档中的遗漏是在该问题引起他们的注意之后出现的

然而,除了以下内容之外,我找不到关于AMD执行x87三角指令准确性的类似详细信息:

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


对于所有有效输入,包括128位或更高的pi近似值,AMD对x87三角指令的实现是否真的完全精确到一个ULP内的扩展精度格式?与Zen和Zen 2体系结构(Ryzen和EPYC)相关的答案是理想的。

我在(;GPLv3)找到了一个程序,该程序旨在测试x87三角指令的准确性。随程序提供的
fpuaccuracy examples
的参考输出使用Intel Core i7-2600(Sandy Bridge)生成,如下所示:

sin with smallest failing argument
argument   4000 C10A 7DC0 DC46 D753   (decimal 3.0162653335001840718)
actual     3FFB FFFF BBF1 3588 24AF   (decimal 0.1249994929300478145)
x87 fpu    3FFB FFFF BBF1 3588 24AE   (decimal 0.12499949293004781449)
error      -1.0002171407788819287 ulp

sin near pi
argument   4000 C90F DAA2 2168 C235   (decimal 3.1415926535897932385)
actual     BFBE ECE6 75D1 FC8F 8CBB   (decimal -5.0165576126683320235E-20)
x87 fpu    BFBF 8000 0000 0000 0000   (decimal -5.42101086242752217E-20)
error      -1376283091369227076.6 ulp

sin with large argument
argument   403D FFFF FFFF 2D2A 9042   (decimal 9223372035086174241)
actual     BFDF E730 CF55 1180 63F3   (decimal -4.2053336735954077951E-10)
x87 fpu    BFF8 C28B 4641 7452 B463   (decimal -0.011874025925697012908)
error      -4.7037861121081250351E+26 ulp

cos with smallest failing argument
argument   3FFF C10E 8AC0 BFEB 5E80   (decimal 1.5082562867317745453)
actual     3FFA FFFF 3EA3 D2D7 355B   (decimal 0.062499279677629184442)
x87 fpu    3FFA FFFF 3EA3 D2D7 355A   (decimal 0.062499279677629184438)
error      -1.005468872258621479 ulp

cos near pi/2
argument   3FFF C90F DAA2 2168 C235   (decimal 1.5707963267948966193)
actual     BFBD ECE6 75D1 FC8F 8CBB   (decimal -2.5082788063341660117E-20)
x87 fpu    BFBE 8000 0000 0000 0000   (decimal -2.710505431213761085E-20)
error      -1376283091369227076.6 ulp

cos with large argument
argument   403D FFFF FFFF 6CE1 B432   (decimal 9223372035620657689)
actual     3FDD DFD2 E369 AE25 7E4A   (decimal 1.0178327217734091432E-10)
x87 fpu    BFF8 C28B 45B2 1490 D117   (decimal -0.011874025404105249357)
error      -1.8815144449581111989E+27 ulp

tan with smallest failing argument
argument   3FFF B8B5 07B4 294A BD53   (decimal 1.4430245999997931928)
actual     4001 F915 0EE5 BAC8 446C   (decimal 7.7838205801874740721)
x87 fpu    4001 F915 0EE5 BAC8 446D   (decimal 7.7838205801874740726)
error      1.0017725812707024772 ulp

tan near pi/2
argument   3FFF C90F DAA2 2168 C235   (decimal 1.5707963267948966193)
actual     C040 8A51 E04D AABD A35F   (decimal -39867976298117107068)
x87 fpu    C040 8000 0000 0000 0000   (decimal -36893488147419103232)
error      743622037674500958.81 ulp

tan with large argument
argument   403D FFFF FFFF DCF6 FE38   (decimal 9223372036560879388)
actual     4005 A86C 499C 14EA BD4A   (decimal 84.211499097398127292)
x87 fpu    401F C10C D618 50D5 E957   (decimal 6477687856.6315280604)
error      9.3353319161898434351E+26 ulp
当在装有AMD Ryzen 7 2700U(Zen)的笔记本电脑上运行时,我得到以下信息:

sin with smallest failing argument
argument   4000 C10A 7DC0 DC46 D753   (decimal 3.0162653335001840718)
actual     3FFB FFFF BBF1 3588 24AF   (decimal 0.1249994929300478145)
x87 fpu    3FFB FFFF BBF1 3588 24AE   (decimal 0.12499949293004781449)
error      -1.0002171407788819287 ulp

sin near pi
argument   4000 C90F DAA2 2168 C235   (decimal 3.1415926535897932385)
actual     BFBE ECE6 75D1 FC8F 8CBB   (decimal -5.0165576126683320235E-20)
x87 fpu    BFBF 8000 0000 0000 0000   (decimal -5.42101086242752217E-20)
error      -1376283091369227076.6 ulp

sin with large argument
argument   403D FFFF FFFF 2D2A 9042   (decimal 9223372035086174241)
actual     BFDF E730 CF55 1180 63F3   (decimal -4.2053336735954077951E-10)
x87 fpu    BFF8 C28B 4641 7452 B463   (decimal -0.011874025925697012908)
error      -4.7037861121081250351E+26 ulp

cos with smallest failing argument
argument   3FFF C10E 8AC0 BFEB 5E80   (decimal 1.5082562867317745453)
actual     3FFA FFFF 3EA3 D2D7 355B   (decimal 0.062499279677629184442)
x87 fpu    3FFA FFFF 3EA3 D2D7 355A   (decimal 0.062499279677629184438)
error      -1.005468872258621479 ulp

cos near pi/2
argument   3FFF C90F DAA2 2168 C235   (decimal 1.5707963267948966193)
actual     BFBD ECE6 75D1 FC8F 8CBB   (decimal -2.5082788063341660117E-20)
x87 fpu    BFBE 8000 0000 0000 0000   (decimal -2.710505431213761085E-20)
error      -1376283091369227076.6 ulp

cos with large argument
argument   403D FFFF FFFF 6CE1 B432   (decimal 9223372035620657689)
actual     3FDD DFD2 E369 AE25 7E4A   (decimal 1.0178327217734091432E-10)
x87 fpu    BFF8 C28B 45B2 1490 D117   (decimal -0.011874025404105249357)
error      -1.8815144449581111989E+27 ulp

tan with smallest failing argument
argument   3FFF B8B5 07B4 294A BD53   (decimal 1.4430245999997931928)
actual     4001 F915 0EE5 BAC8 446C   (decimal 7.7838205801874740721)
x87 fpu    4001 F915 0EE5 BAC8 446C   (decimal 7.7838205801874740721)
error      0.0017725812707024772387 ulp

tan near pi/2
argument   3FFF C90F DAA2 2168 C235   (decimal 1.5707963267948966193)
actual     C040 8A51 E04D AABD A35F   (decimal -39867976298117107068)
x87 fpu    C040 8000 0000 0000 0000   (decimal -36893488147419103232)
error      743622037674500958.81 ulp

tan with large argument
argument   403D FFFF FFFF DCF6 FE38   (decimal 9223372036560879388)
actual     4005 A86C 499C 14EA BD4A   (decimal 84.211499097398127292)
x87 fpu    401F C10C D618 50D5 E957   (decimal 6477687856.6315280604)
error      9.3353319161898434351E+26 ulp
除了一个例外(最小失败参数),结果是相同的。我还测试了我的Ryzen 9 3950X(Zen 2),得到了相同的结果


总之,最近的AMD处理器,包括Zen和Zen 2体系结构,使用了66位的pi近似值,并且在给定某些参数时,会产生与现代英特尔处理器对x87三角指令相同的误差。

对于较旧的AMD CPU,我提供了一个答案。请注意,当前形式的这个问题是关于“通用计算硬件”的,因此在技术上与此无关。还有一些关于浮点精度的其他问题,它们确实与特定处理器上的编程(x87浮点)有关,因此AIUI这个问题是关于主题的。测试6381956970095103•2^798,也称为
+0x1.6AC5B262CA1FFp850
。即IEEE-754二进制64值大于4,最接近π的倍数。它的正弦值在附近−2^−60(最接近的二进制64是
-0x1.14AE72E6BA22Fp-60
)。如果在π的值小于900位的情况下进行变元缩减,则应显示它。如果AMD的FSIN支持范围小于整个binary64有限范围,请告诉我,我将在其中搜索最坏的情况。(仅供参考,macOS
sin
返回
--0x1.14AE72E6BA22Fp-60
)我刚刚在装有Ryzen 7 2700U的笔记本电脑上运行了该实用程序,看起来AMD Zen确实使用了66位pi,因为“sin near pi”情况下的
fpuaccuracy examples
的输出与程序提供的示例输出相同,这是运行在英特尔核心i7-2600(桑迪桥)。我目前不使用基于Zen 2的桌面(Ryzen 9 3950X),但我会在有机会时对其进行测试。不过,我怀疑结果会有什么不同。