Почему и когда следует вызывать _fpreset ()? - PullRequest
4 голосов
/ 09 февраля 2010

Единственная документация, которую я могу найти (на MSDN или иным способом), заключается в том, что вызов _fpreset() "сбрасывает пакет с плавающей запятой". Что такое пакет с плавающей запятой? Очищает ли это также слово состояния FPU? Я вижу документацию, в которой говорится, что при восстановлении с SIGFPE вызывать _fpreset(), но разве _clearfp() тоже не делает этого? Нужно ли звонить обоим?

Я работаю над приложением, которое разоблачает некоторые исключения FP (используя _controlfp()). Когда я хочу сбросить FPU в состояние по умолчанию (скажем, при вызове кода .NET), я должен просто вызвать _clearfp(), _fpreset() или и . Это критичный для производительности код, поэтому я не хочу вызывать оба, если мне не нужно ...

1 Ответ

3 голосов
/ 09 февраля 2010

_fpreset() сбрасывает состояние модуля с плавающей запятой. Он сбрасывает точность FPU до значения по умолчанию , а очищает слово состояния FPU. Два случая, которые я вижу, чтобы использовать его, это при восстановлении из FPE (как вы сказали) и при возврате контроля из библиотечного кода (например, DLL, которую вы не можете контролировать), который каким-либо образом испортил FPU, например, изменив точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...