gpt4 book ai didi

delphi - 在Delphi中使用SSE进行舍入

转载 作者:行者123 更新时间:2023-12-03 15:22:05 25 4
gpt4 key购买 nike

我编写了这个函数来将单数舍入为整数:

function Round(const Val: Single): Integer;
begin
asm
cvtss2si eax,Val
mov Result,eax
end;
end;

它有效,但我需要更改舍入模式。显然,根据 this ,我需要设置MXCSR寄存器。

如何在 Delphi 中执行此操作?

我首先这样做的原因是我需要“远离零”舍入(就像在 C# 中一样),即使通过 SetRoundingMode 也是不可能的。

最佳答案

在现代 Delphi 上,要设置 MXCSR,您可以调用 SetMXCSR来自系统单元。要读取当前值,请使用 GetMXCSR

请注意,SetMXCSR 就像 Set8087CW 一样不是线程安全的。尽管我努力说服 Embarcadero 改变这一点,但似乎这个特殊的设计缺陷将永远伴随着我们。

在旧版本的 Delphi 上,您使用 LDMXCSRSTMXCSR 操作码。您可以像这样编写自己的版本:

function GetMXCSR: LongWord;
asm
PUSH EAX
STMXCSR [ESP].DWord
POP EAX
end;

procedure SetMXCSR(NewMXCSR: LongWord);
//thread-safe version that does not abuse the global variable DefaultMXCSR
var
MXCSR: LongWord;
asm
AND EAX, $FFC0 // Remove flag bits
MOV MXCSR, EAX
LDMXCSR MXCSR
end;

这些版本是线程安全的,我希望能够在旧的 Delphi 版本上编译和工作。

请注意,为您的函数使用名称 Round 可能会引起很多困惑。我建议您不要这样做。

最后,我查看了 Intel 文档,发现两个 Intel 浮点单元(x87、SSE)仅提供 IEEE754 标准指定的舍入模式。他们是:

  • 四舍五入到最接近的(偶数)
  • 向下舍入(向 −∞ 方向舍入)
  • 向上舍入(向+∞方向舍入)
  • 向零舍入(截断)

因此,您想要的舍入模式不可用。

关于delphi - 在Delphi中使用SSE进行舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27125105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com