在現代Delphi上,要設置MXCSR,您可以撥打System
單位的SetMXCSR
。要讀取當前值,請使用GetMXCSR
。
小心SetMXCSR
,就像Set8087CW
不是線程安全的。儘管我努力說服Embarcadero改變這種情況,但似乎這種特殊的設計缺陷將永遠留在我們身邊。
在舊版Delphi上,您使用LDMXCSR
和STMXCSR
操作碼。你可以寫自己的版本是這樣的:
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;
這些版本是線程安全的,我希望將編譯並運行在老德爾福版本。
請注意,爲您的功能使用名稱Round
可能會造成很多混淆。我會建議你不要這樣做。
最後,我檢查了英特爾文檔,並且英特爾浮點單元(x87,SSE)都提供了IEEE754標準規定的舍入模式。它們是:
- 四捨五入至最近的(甚至)
- 回合下來(-∞朝)
- 四捨五入(朝向+∞)
- 回合向零(截斷)
所以,你想要的舍入模式不可用。
爲什麼downvote? – IamIC 2014-11-25 11:32:23
你不需要'mov Result,eax'。結果**是** eax。其實'功能圓形(const Val:單一):整數; asm cvtss2si eax,Val end;'夠了;) – 2014-11-25 17:09:45
謝謝。這回答了另一個問題。 – IamIC 2014-11-25 17:25:47