忽略C ++中的浮点溢出和下溢错误

时间:2019-11-28 16:38:55

标签: c++ visual-c++ floating-point

以下代码段

void main()
{
   float a = 68440675640679078541805800652800.0f;
   float b = a*a;
   cout << b << endl;
}

在MSVC 2017中产生浮点溢出运行时错误。我不想检查float a是否足够小以进行乘法运算。

如何告诉C ++编译器建立一个忽略浮点上溢和下溢错误的程序?在寻找答案时,我在

遇到了_controlfp_s函数

https://docs.microsoft.com/de-de/cpp/c-runtime-library/reference/controlfp-s?view=vs-2019

但是我没有设法使其正常工作。

2 个答案:

答案 0 :(得分:0)

您可以使用以下MSVC来禁用特定的#pragma警告(但警告 必须在main函数的外部且之前):

#pragma warning(disable:4756)
void main()
{
   float a = 68440675640679078541805800652800.0f;
   float b = a*a;
   cout << b << endl;
}

然后,编译器将静静地给出b具体的IEEE代码,该代码将浮点值标记为“无穷大”(see this Wikipedia page),而您的cout线会反映出这一点。

任何时候,您都可以使用类似的#pragma行来重新启用警告,但用“默认”代替“禁用”。

答案 1 :(得分:0)

对于Microsoft Visual C ++,可以使用_controlfp_s来获取和设置浮点控制字。对于您的代码段,可能的解决方案如下:

int main()
{
    unsigned int fp_control;
    //Reading
    _controlfp_s(&fp_control, 0, 0);
    //Make changes
    unsigned int new_fp_control = fp_control | _EM_OVERFLOW | _EM_UNDERFLOW;
    //Update
    _controlfp_s(&fp_control, new_fp_control, _MCW_EM);

    float a = 68440675640679078541805800652800.0f;
    float b = a*a;
    out << b << ed;
}
相关问题