Как я могу установить и восстановить регистры FPU CTRL?
Вопрос
Я могу сбросить регистры CTRL FPU с помощью этого:
http://support.microsoft.com/kb/326219
Но как я могу сохранить текущие регистры и восстановить их позже?
Это из .net-кода..
То, что я делаю, происходит из Delphi, вызывающего .net dll в качестве COM-модуля.Проверка Ctrl регистры в delphi выдают одно значение, проверка с помощью controlfp в коде .net дает другое значение.Что мне нужно, так это существенно сделать это:
_controlfp(_CW_DEFAULT, 0xfffff);
Таким образом, мои вычисления с плавающей точкой в коде .net не завершаются сбоем, но я хочу восстановить Ctrl регистрируется при возврате.
Может быть, я этого не делаю?Может быть, Delphi сбрасывает их при необходимости?Я писал в блоге об этой проблеме здесь.
Решение
uses
SysUtils;
var
SavedCW: Word;
begin
SavedCW := Get8087CW;
try
Set8087CW($027f);
// Call .NET code here
finally
Set8087CW(SavedCW);
end;
end;
Другие советы
Та же функция, которую вы используете для их изменения: _controlfp()
.Если вы передадите маску, равную 0, текущее значение не будет изменено, но оно будет будет возвращен - сохраните его и используйте второй вызов для _controlfp()
чтобы восстановить его позже.