_controlfp_s中可能存在的错误可能无法正确恢复控制字

时间:2009-03-12 02:25:37

标签: c++ visual-studio visual-studio-2008 visual-c++

我偶然发现了_controlfp_s(Visual Studio 2008)的问题,或者我对它的理解。我认为第一个out参数在应用其他参数的更改之前返回控制标志。似乎它在更改后返回标志。

所以,我认为使用它的正确方法是这样的:

// Chop rounding
unsigned int old;
_controlfp_s(&old, _RC_CHOP, _MCW_RC);

// Do chopped math


// Restore
unsigned int unused;
_controlfp_s(&unused, old, _MCW_RC);

不幸的是我需要这样做:

// Save
unsigned int old1;
_controlfp_s(&old1, 0, 0);

// Chop rounding
unsigned int old2;
_controlfp_s(&old2, _RC_CHOP, _MCW_RC);

// Do chopped math


// Restore
unsigned int unused;
_controlfp_s(&unused, old1, _MCW_RC);

我错过了什么吗?看起来非常愚蠢,不得不这样做。

顺便说一句:我已经向MS报告过,他们说他们无法理解,并建议我提供一个显示问题的视频。是的。

布拉德

2 个答案:

答案 0 :(得分:3)

根据MSDN

  

如果mask的值等于0 ,   _controlfp_s获取浮点控制字。如果mask是非零的,a   设置控制字的新值:   对于任何打开(等于1)的位   掩码,新的相应位是   用于更新控制字。在   换句话说,fpcntrl =((fpcntrl&   〜面具)| (new& mask))其中fpcntrl   是浮点控制字。

(强调我的) 因此,可靠地存储当前控制字的方法是您编写的第二种方法(您已经找到的方法)。如果您正在修改控制字,那么您将不会为掩码传递0,并且根据函数文档,它将不会检索当前控制字。

答案 1 :(得分:0)

所以看起来这可能是设计 - 这只是愚蠢。

你改变它后什么时候想知道控制字?然而,你几乎总是不喜欢旧的控制字,所以你可以把它放回去。

这只会迫使你进行额外的通话,因为有人在设计功能时没有想到。

所以我现在改用这种方法:

_controlfp_s(&uiOldCW, _CW_DEFAULT, 0xfffff);