以下代码段
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
但是我没有设法使其正常工作。
答案 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;
}