_controlfp не меняет точность - PullRequest
2 голосов
/ 23 ноября 2011

Код ниже демонстрирует это

#include <float.h>
#include <stdint.h>
#pragma fenv_access(on) // apparently ineffective

int main(int argc, char **argv)
{
    uint32_t cw;
    cw = _controlfp(0,0);               // cw = 0x0008001f
    cw = _controlfp(_PC_24,_MCW_PC);    // cw = SAME!
    cw = _controlfp(_PC_53,_MCW_PC);    // cw = STILL THE SAME!

    return 0;
}

Мне нужно установить рабочую точность, так как от этого зависит много старого кода генерации сетки. Перед переходом на 64-битную версию я добавил fstcw [cur_cw] и т. Д., И все было хорошо. Однако, поскольку vs2010 не поддерживает встроенную сборку для 64-битных целевых объектов, кажется, что единственное работоспособное решение, которое у меня есть, - это создать отдельный файл .asm для этой цели. Есть еще одна волшебная, не очень хорошо документированная опция компилятора, о которой я не знаю, которая заставит _controlfp сотрудничать?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Вы уверены, что используется старый x87 FPU?Я ожидаю, что все операции с плавающей запятой будут выполняться с использованием инструкций SSE по умолчанию;на x86_64 нет веской причины не использовать SSE.

0 голосов
/ 29 декабря 2014

_MCW_PC (Precision control) Не поддерживается на платформах ARM или x64.

Источник: http://msdn.microsoft.com/en-us/library/e9b52ceh.aspx

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