我们正在编写一个模拟器,并想知道在给定FPU状态下,运行FPU指令(例如FDIV)后,FPU的状态是否是确定性的?
有许多实现x87指令集的兼容英特尔CPU架构。在测试我们的FPU仿真的正确性时,我们应该依赖于结果CPU状态吗?
不同的实现会进行不同的舍入/计算吗?
我们正在编写一个模拟器,并想知道在给定FPU状态下,运行FPU指令(例如FDIV)后,FPU的状态是否是确定性的?
有许多实现x87指令集的兼容英特尔CPU架构。在测试我们的FPU仿真的正确性时,我们应该依赖于结果CPU状态吗?
不同的实现会进行不同的舍入/计算吗?
+
、-
、*
、/
、sqrt
,x87 FPU是确定性的。例如,在其默认状态下(全宽度有效数字和四舍五入到最近偶数模式),x + y
的结果恰好是最接近x
和y
的数学求和结果的可表示80位浮点值。FSIN
)。这些指令的结果因处理器品牌和型号而异。在您的仿真器中,您可能只需要提供使用中最差的实现之一即可。如果您使用主机语言的数学库中的sinl()
函数的结果(通常比FSIN
更好,因为它是通过显式参数减少和多项式逼近实现的,而不是调用FSIN
),则没有人会抱怨。正如其他人所说,基本的五个操作将在所有x87 FPUs上给出相同的结果。然而...
x87 FPU很特别。它的80位寄存器意味着它可能会得到与任何其他FPU(比如具有64位浮点寄存器的PowerPC或ARM)不同的结果。这些结果可能更好或更差。即使将x87舍入模式设置为32位或64位,也不能使其与PowerPC/ARM相同,因为指数仍未受限制。
对于编写仿真器来说,这并不重要,除了这意味着您不能一定使用主机FPU来模拟x87 FPU。我在这两篇文章中涵盖了许多这些问题:
http://randomascii.wordpress.com/2013/07/16/floating-point-determinism http://randomascii.wordpress.com/2012/03/21/intermediate-floating-point-precision/