Delphi 浮点操作32位模式与64位模式

Delphi 浮点操作32位模式与64位模式,delphi,32bit-64bit,floating-accuracy,Delphi,32bit 64bit,Floating Accuracy,我在Delphi中有相同的数字处理源代码,它被编译为32位和64位应用程序。从日志文件中,我可以看到数字略有不同(1e-14相对误差)。所以我想知道,在运行32位和64位代码时,同一个CPU是否可能执行不同的浮点操作。或者它是由编译器负责的。Extended在X64中等于Double。X32模式使用FPU浮点单元,而X64使用SSE寄存器执行浮点 还有compiler指令,默认情况下它是打开的,并将中间单浮点数保持为双浮点数。我假设代码没有显式使用扩展的。由于该数据类型在32位和64位之间不同(

我在Delphi中有相同的数字处理源代码,它被编译为32位和64位应用程序。从日志文件中,我可以看到数字略有不同(1e-14相对误差)。所以我想知道,在运行32位和64位代码时,同一个CPU是否可能执行不同的浮点操作。或者它是由编译器负责的。

Extended
在X64中等于
Double
。X32模式使用FPU浮点单元,而X64使用SSE寄存器执行浮点


还有compiler指令,默认情况下它是打开的,并将中间单浮点数保持为双浮点数。

我假设代码没有显式使用
扩展的
。由于该数据类型在32位和64位之间不同(32位为10字节,64位为8字节),因此任何显式使用
Extended
都会带来直接的差异。我假设您对所有变量都使用了
Double
。尽管下面的参数在
Single
中传输相同

除此之外,最常见的原因是两个浮点单元之间的行为差异

由32位代码使用的x87单元将中间值存储到80位扩展精度。64位代码使用的SSE单元将中间值存储为64位双精度

现在,可以使用控制字配置x87单元,以将中间值存储到64位精度。它在性能方面没有什么区别,但会使32位和64位结果更接近

即使这样,在不同的单元上也不会得到完全相同的结果。事实上,您不会在所有x87单元上得到完全相同的结果。尽管这些单元都符合IEEE754标准,但该标准允许一定程度的计算余地

更重要的是,高阶计算,如三角、对数、幂等,在32位和64位之间的执行方式非常不同。32位单元比64位单元具有更多的内置功能。您将在Delphi源代码中注意到,例如,trig函数都是在64位RTL中实现的。在32位代码上,它们通过调用x87操作来实现


底线是,当涉及浮点计算时,您永远不会让32位和64位程序完全一致。您必须接受较小公差的差异。

相关说明:64位程序和浮点计算-您的假设是正确的:没有明确的
扩展
,只有
双倍
。我想知道为什么64位模式的CPU不能使用x87单元。似乎更准确。64位代码中的CPU可以使用x87单元。但这并不准确。SSE FP比x87 FP快得多。最近的趋势是以牺牲x87为代价将晶体管预算花费在SSE单元上。有一个库使用64位x87 FPU对一些数学功能进行后移植@那是一个非常整洁的图书馆。它只是扩展了,所以它不会帮助您在x87上运行双精度数学,在我看来,这不是一个好主意。如果我记得的话,该库将记录声明为打包,我认为这是一个错误。David,TExtendedX87是一个变体记录,我认为在Win64中打包关键字是可以的
TExtendedX87=0的压缩记录大小写字节:(AsBytes:byte的压缩数组[0..9];1:(AsExtRec80:System.TExtended80Rec);结束