linux程序 报浮点异常,浮点数异常处理 - C++ Builder 参考手册 - C++ 爱好者

本文介绍了处理浮点数运算中可能出现的溢出和被零除异常的两种方法:一是允许计算结果为+INF、-INF和NAN,二是使用try...catch捕获异常。在C++Builder中,可以通过设置异常屏蔽来控制异常行为。通过示例代码展示了如何在出现异常时捕获并显示错误信息。
摘要由CSDN通过智能技术生成

如果浮点数运算产生了溢出,或者被零除,会抛出异常,这会影响程序的正常运行,通常处理的方法有两种:

• 第一种方法:允许计算结果为 +INF、-INF 和 NAN 这些浮点数值,永远不抛出异常。

• 第二种方法:用 try ... catch 捕获异常,计算结果不会出现 +INF、-INF 和 NAN;

禁用浮点数异常的语句只需要在程序启动的时候执行一次,以后所有的浮点数溢出和被零除等都不抛出异常,计算结果为 +INF、-INF 和 NAN

头文件

#include

#include

64 位 Windows

C++ Builder XE3 及之后的版本

不支持 (缺少库文件)

32 位 Windows

C++ Builder XE2 及之后的版本

所有版本的 C++ Builder

备注

新版本 C++ Builder 需要使用这个方法

老版本 C++ Builder 采用的方法,不支持 64 位

测试程序:

#include

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

SetExceptionMask(exAllArithmeticExceptions);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

double a =  1.0;

double b = -1.0;

double c =  0.0;

double x = a / c;

double y = b / c;

double z = c / c;

Memo1->Lines->Add(L"x = " + FloatToStr(x));

Memo1->Lines->Add(L"y = " + FloatToStr(y));

Memo1->Lines->Add(L"z = " + FloatToStr(z));

}

运行结果:

345a946387b63fddd66edd475a4205c0.png

对于 C++ Builder 来说,和普通的异常一样,用 try ... catch 或 try ... __finally 处理异常。

测试程序:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

try

{

double a =  1.0;

double b = -1.0;

double c =  0.0;

double x = a / c;

double y = b / c;

double z = c / c;

Memo1->Lines->Add(L"x = " + FloatToStr(x));

Memo1->Lines->Add(L"y = " + FloatToStr(y));

Memo1->Lines->Add(L"z = " + FloatToStr(z));

}

catch(Exception &e)

{

MessageBox(Handle, (L"错误:" + e.ClassName() + L"\r\n" + e.Message).c_str(), L"错误信息", MB_OK|MB_ICONEXCLAMATION);

}

}

e633a73e92fdea22f3cf51f01074fc7e.png

通过这个测试程序可以看到:

当任何一句代码产生异常,都会从 try { } 里面跳出,转到 catch(){ } 里面,

在 catch 里面,可以通过 Exception &e 得到异常的类型和错误信息。

如果不希望出错之后放弃所有的计算,需要每条语句都写在一个单独的 try ... catch 里面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值