下面的代码演示了这一点

#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合作吗?

最佳答案

您确定使用的是旧的x87 FPU吗?我希望默认情况下所有浮点都将使用SSE指令执行;在x86_64上,没有充分的理由不使用SSE。

关于c++ - _controlfp不更改精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8234873/

10-11 22:45