我们应该对64位Delphi编译器中的浮点支持有什么期望?
64位编译器是否会使用SSE 实现浮点运算?
64位编译器是否支持 目前的80位浮点型 (扩展)?
这些问题密切相关,因此我将它们视为一个问题。
答案 0 :(得分:5)
我在这个主题上发了两篇文章(here和there),总结一下,是的,64位编译器使用SSE2(双精度),但它不使用SSE(单精度) 。所有东西都转换为双精度浮点数,并使用SSE2计算(编辑:但是有一个选项来控制它)
这意味着f.i.如果双精度浮点数的数学速度很快,则单精度数学运算缓慢(单精度和双精度之间的冗余转换很多),“扩展”别名为“双精度”,中间计算精度限制为双精度
编辑:有一个未记录的(当时)指令控制SSE代码生成,{$EXCESSPRECISION OFF}激活SSE代码生成,从而使性能恢复到预期之内。
答案 1 :(得分:3)
根据Marco van de Voort的回答:How should I prepare my 32-bit Delphi programs for an eventual 64-bit compiler:
x87 FPU在x64上已弃用,通常SSE2将用于浮点数。所以浮点和它的异常处理可能稍有不同,扩展可能不是80位(但64位或不太可能是128位)。这也与通常的四舍五入(copro controlwork)变化有关,当与需要不同fpu字的C代码接口时。
PHis对该答案发表了评论:
我不会说x87 FPU已被弃用,但微软已经决定尽力做到这一点(而且他们似乎并不喜欢80位FP值)虽然技术上可以在Win64上使用FPU / 80位浮点数。
答案 2 :(得分:3)
我刚刚发布了你的另一个问题的答案,但我想它实际上应该放在这里:
显然,除了Embarcadero之外,没有人可以在产品发布之前肯定回答这个问题。
任何像样的x64编译器都很可能会使用SSE2指令集作为基线,因此尝试尽可能多地使用SSE功能进行浮点计算,从而最大限度地减少x87 FPU的使用。但是,也应该说没有技术上的原因会妨碍在x64应用程序代码中使用x87 FPU(尽管有相反的传闻已经存在了一段时间;如果你想了解更多关于这一点的信息,请看一下Agner Fog's Calling Convention Manual,特别是第6.1章“可以在64位Windows中使用浮点寄存器吗?”。
编辑1 :Delphi XE2 Win64确实不支持开箱即用的80位浮点计算(参见例如discussionuion here(尽管它允许读/写这样的)可以使用记录+类运算符将这些功能带回Delphi Win64,就像this TExtendedX87 type中所做的那样(尽管有一些警告适用)。
答案 3 :(得分:2)
对于double =扩展位:
阅读ALlen Bauer的推特账号Kylix_rd:
事后看来逻辑上,因为虽然SSE2 regs是128位,但它们被用作两个64位双精度数。
答案 4 :(得分:2)
我们不确定64位Delphi编译器在Embarcadero实际发布它之前如何实现浮点运算。之前的任何事情都只是猜测。但是,一旦我们确切知道,对此采取任何行动都为时已晚。
Allen Bauer的推文确实表明他们将使用SSE2,并且扩展类型可能会减少到64位而不是80位。出于各种原因,我认为这是个坏主意。我在QualityCentral报告Extended should remain an 80-bit type on 64-bit platforms
中写了我的想法如果您不希望在移动到64位Delphi时代码从80位精度降至64位精度,请单击QualityCentral链接并投票选择我的报告。投票越多,Embarcadero就越有可能倾听。如果他们确实将SSE2用于64位浮点,这是有道理的,那么使用FPU添加80位浮点将是Embarcadero的额外工作。我怀疑他们会做那项工作,除非很多开发人员要求它。
答案 5 :(得分:1)
如果您真的需要它,那么您可以使用TExtendedX87 unit中提到的Philipp M. Schlüter PhiS on SO this Embarcadero forum thread。
@PhiS:当你用我的信息更新答案时,我会删除我的。