当前位置: 首页 > 知识库问答 >
问题:

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

羊浩广
2023-03-14

在Intel处理器上,由于使用了66位的pi近似值,x87三角指令(如FSIN)的精度有限,尽管计算本身可以精确到80位扩展精度浮点值的全部64位尾数。(所有有效输入的完全精度要求圆周率的128位近似值。)英特尔文件中的遗漏在问题被提请他们注意后得到了纠正。

然而,除了在AMD64架构程序员手册第1卷中提到的内容之外,我找不到类似的关于AMD实现x87三角指令准确性的详细信息:

共有1个答案

范书
2023-03-14

我在http://notabs.org/fpuaccuracy/(直接下载链接;GPLv3)找到了一个程序,用于测试x87三角指令的准确性。使用Intel Core i7-2600(Sandy Bridge)生成的程序附带的fpuprecision示例参考输出如下:

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

除了一个例外(tan具有最小的失败参数),结果是相同的。我还在我的Ryzen 9 3950x(Zen2)上进行了测试,得到了相同的结果。

总之,最近的AMD处理器,包括Zen和Zen2架构,使用了66位的圆周率近似值,当给定某些参数时,会产生与现代英特尔处理器相同的x87三角指令不精确。

 类似资料:
  • 5.2.13 处理器指令 处理器指令是一组控制CPU工作方式的指令。这组指令的使用频率不高。 1、空操作指令NOP(No Operation Instruction) 该指令没有的显式操作数,主要起延迟下一条指令的执行。通常用执行指令“XCHG AX, AX”来代表它的执行。NOP指令的执行不影响任何标志位。 指令的格式:NOP 2、等待指令WAIT(Put Processor in Wait S

  • 问题内容: plnkr链接 我有一个我想将html绑定到它的元素。 这样可行。现在,连同它,我还有一个绑定到绑定的html的指令: 但是带有div和anchor 的指令不求值。我该如何运作? 问题答案: 我也遇到了这个问题,经过几个小时的互联网搜索,我读到了@Chandermani的评论,事实证明这是解决方案。您需要使用以下模式调用“编译”指令: HTML: JS: 您可以在这里看到它的工作提琴

  • 主要内容:C# 中的预处理器指令,#define 预处理器,条件指令预处理指令的作用主要是向编译器发出指令,以便在程序编译开始之前对信息进行一些预处理操作。在 C# 中,预处理器指令均以 开头,并且预处理器指令之前只能出现空格不能出现任何代码。另外,预处理器指令不是语句,因此它们不需要以分号 结尾。 在 C# 中,预处理指令用于帮助条件编译。不同于 C 和 C++ 中的指令,在 C# 中不能使用这些指令来创建宏,而且预处理器指令必须是一行中唯一的代码,不能掺杂其它

  • http://maven.apache.org/xsd/maven-4.0.0.xsd" 尊敬的各位:, 我需要一些帮助来实现我的项目中的mapstruct。我已经有一些注释处理器需要在pom中命名。maven的xml

  • 预处理程序指令指示编译器在实际编译开始之前预处理信息。 所有预处理程序指令都以#开头,并且只有空格字符可能出现在一行上的预处理程序指令之前。 预处理程序指令不是语句,因此它们不以分号(;)结尾。 C#编译器没有单独的预处理器; 但是,指令的处理就像有一个指令一样。 在C#中,预处理程序指令用于帮助进行条件编译。 与C和C ++指令不同,它们不用于创建宏。 预处理程序指令必须是一行上的唯一指令。 C