delphi – 浮点运算32位模式与64位模式
发布时间:2020-12-15 09:38:48 所属栏目:大数据 来源:网络整理
导读:我在Delphi中使用相同数量的运算源代码,它被编译为32位和64位应用程序.从日志文件中我可以看到数字略有不同(1e-14相对误差).所以我想知道在运行32位和64位代码时,同一CPU是否可能以不同方式执行浮点运算.或者它是编译器负责的东西. 解决方法 我将假设代码没
我在Delphi中使用相同数量的运算源代码,它被编译为32位和64位应用程序.从日志文件中我可以看到数字略有不同(1e-14相对误差).所以我想知道在运行32位和64位代码时,同一CPU是否可能以不同方式执行浮点运算.或者它是编译器负责的东西.
解决方法
我将假设代码没有明确使用Extended.由于该数据类型在32位和64位之间不同(32位为10位,64位为8位),因此任何显式使用Extended都会产生直接差异.我将假设您使用Double来表示所有变量.虽然下面的论点平等转移到单一.
除此之外,最常见的原因是两个浮点单元之间的行为差??异. 由32位代码使用的x87单元将中间值存储为80位扩展精度.由64位代码使用的SSE单元将中间值存储为64位双精度. 现在,可以使用控制字配置x87单元,将中间值存储为64位精度.它在性能方面没有任何区别,但会使您的32位和64位结果更接近. 即使这样,你也不会在不同的单位上获得完全相同的结果.事实上,你不会在所有x87单位上得到完全相同的结果.尽管这些单元都符合IEEE754标准,但该标准允许一定程度的计算余地. 更重要的是,在32位和64位之间执行高阶计算,如三角函数,对数,取幂等. 32位单元具有比64位单元更多的内置功能.您将在Delphi源代码中注意到,例如,trig函数都是在RTL中为64位实现的.在32位代码上,它们通过调用x87 ops来实现. 最重要的是,当涉及浮点计算时,您永远不会让32位和64位程序完全一致.您必须接受差异才能获得较小的容忍度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |