我偶然发现了_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报告过,他们说他们无法理解,并建议我提供一个显示问题的视频。是的。布拉德
答案 0 :(得分:3)
根据MSDN:
如果mask的值等于0 , _controlfp_s获取浮点控制字。如果mask是非零的,a 设置控制字的新值: 对于任何打开(等于1)的位 掩码,新的相应位是 用于更新控制字。在 换句话说,fpcntrl =((fpcntrl& 〜面具)| (new& mask))其中fpcntrl 是浮点控制字。
(强调我的) 因此,可靠地存储当前控制字的方法是您编写的第二种方法(您已经找到的方法)。如果您正在修改控制字,那么您将不会为掩码传递0,并且根据函数文档,它将不会检索当前控制字。
答案 1 :(得分:0)
所以看起来这可能是设计 - 这只是愚蠢。
你改变它后什么时候想知道控制字?然而,你几乎总是不喜欢旧的控制字,所以你可以把它放回去。
这只会迫使你进行额外的通话,因为有人在设计功能时没有想到。
所以我现在改用这种方法:
_controlfp_s(&uiOldCW, _CW_DEFAULT, 0xfffff);