@CPPJunior

Как отключить extended precision mode для FPU из DLL?

Здравствуйте.
Я поддерживаю dll (msvc 2008 + qt4), которая используется другим приложением. Видимо это приложение переключает FPU в режим extended precision, поэтому QLocale::toString начинает работать неправильно.
Пример (see bugreport https://bugreports.qt.io/browse/QTBUG-13509):
// QLocale::toString is used inside QString::number
qDebug() << QString::number(1951.0); // 1951
// switch FPU to extended precision mode
 __asm
{
     FNINIT
     sub esp,2
     mov word ptr [esp],037Fh ; ensure precision control is extended, and exception masks set.
     fldcw [esp]
     add esp,2
}
qDebug() << QString::number(1951.0); // 1950.:

Чтобы это исправить я решил попробовать отключать этот режим в функции DllMain, но это почему то не работает. Подскажите пожалуйста:
1. Как отключить/переключить precision mode для FPU из dll?
2. Стоит ли вообще так делать? Я так понимаю, что это глобальная настройка, которая может повлиять на результаты вычислений других программ.
3. Можно ли обойти баг используя настройки компилятора? Т.е. не использовать FPU (генерить код для SSE например).

Заранее спасибо.

UPDATE
Немного поразмыслив и погуглив я пришел к следующим выводам.
2. Настройка устанавливается для каждого процесса (т.к. я пробовал запускать свою dll под разными программами одновременно, при этом в одном случае баг появился, а в другом - нет).
3. Наверное возможно в общем случае (stackoverflow.com/questions/2565693/floating-point... но конкретно для решения моей проблемы нужно будет пересобирать QtCore (т.к. код с багом скорее всего находится в этой dll).
1. Вопрос остаётся открытым. Логично было бы делать это в DllMain, но так не работает (в моем случае), наверно тут существенно как работает клиент dll/
  • Вопрос задан
  • 393 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы