主页C++ Builder 资料C++ Builder 参考手册cmath 数学函数_matherr, _matherrl
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
 • acos, acosf, acosl
 • acosh, acoshf, acoshl
 • asin, asinf, asinl
 • asinh, asinhf, asinhl
 • atan, atanf, atanl
 • atan2, atan2f, atan2l
 • atanh, atanhf, atanhl
 • ceil, ceilf, ceill
 • copysign, copysignf, copysignl
 • cos, cosf, cosl
 • cosh, coshf, coshl
 • exp, expf, expl
 • exp2, exp2f, exp2l
 • expm1, expm1f, expm1l
 • fabs, fabsf, fabsl
 • floor, floorf, floorl
 • fmod, fmodf, fmodl
 • frexp, frexpf, frexpl
 • hypot, hypotf, hypotl
 • ldexp, ldexpf, ldexpl
 • log, logf, logl
 • log10, log10f, log10l
 • log1p, log1pf, log1pl
 • log2, log2f, log2l
 • modf, modff, modfl
 • nan, nanf, nanl
 • poly, polyl
 • pow, powf, powl
 • pow10, pow10l
 • round, roundf, roundl
 • sin, sinf, sinl
 • sinh, sinhf, sinhl
 • sqrt, sqrtf, sqrtl
 • tan, tanf, tanl
 • tanh, tanhf, tanhl
 • trunc, truncf, truncl
 • _exception, _exceptionl
 • _matherr, _matherrl
 • HUGE_VAL, HUGE_VALF, HUGE_VALL, _LHUGE_VAL
 • EDOM, ERANGE
 • _mexcep, DOMAIN, SING, OVERFLOW, UNDERFLOW, TLOSS, PLOSS, STACKFAULT
 • M_E, M_LOG2E, M_LOG10E, M_LN2, M_LN10
 • M_PI, M_PI_2, M_PI_4, M_1_PI, M_2_PI, M_1_SQRTPI, M_2_SQRTPI
 • M_SQRT2, M_SQRT_2
 • DOMAIN error 定义域错误
cstdlib 标准库函数
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
_matherr, _matherrl - cmath 数学函数的异常捕获和异常处理函数

 • 如果程序里面实现了 _matherr 和 _matherrl 函数,当 cmath / math.h 函数无法计算或计算出错的时候,会自动调用 _matherr 和 _matherrl 函数来处理异常。这两个函数必须是 C 语言格式的,不可以是 C++ 格式,不可以放在命名空间里面。如果使用 C++ 编译器,需要放在 extern "C" { } 里面,或者直接用 extern "C" 修饰。

 • cmath / math.h 函数出错产生的异常无法使用 try ... catch 来捕获,只可以通过 _matherr 和 _matherrl 函数捕获异常。

 • C++11 标准规定使用全局变量 math_errhandling = MATH_ERRNO; 函数运算出错时使用 errno 错误编码,不抛出异常。目前所有的 C++ Builder 版本都不支持 math_errhandling 这个全局变量,只能通过 _matherr 和 _matherrl 函数捕获异常。

函数原型:

函数原型 Turbo C/C++
Borland C++
Visual C++ C90 C99 C++98 C++11
int _matherr(struct _exception *e);        
int _matherrl(struct _exceptionl *e);        

头文件:

#include <cmath>

命名空间:

无。由于为了兼容 C 语言的捕获异常方式,_exception 和 _exceptionl 结构体,与 _matherr 和 _matherrl 函数都不在命名空间里面

参数:

e:_exception_exceptionl 类型的结构体

返回值:

0:这是一个错误,系统显示异常提示窗口;
不等于 0 的数值:运算成功,系统不显示异常提示窗口。

例子:

这段代码放在项目里面的任何一个 .c 或 .cpp 里面的任何位置都可以捕获 cmath / math.h 函数的异常。

#ifdef __cplusplus
extern "C" {
#endif

int _matherr(struct _exception *e) // 捕获 double 版本的函数异常
{
  return 1; // 忽略错误,计算结果为 +INF, -INF 或 NAN
}

int _matherrl(struct _exceptionl *e) // 捕获 long double 版本的函数异常
{
  return 1; // 忽略错误,计算结果为 +INF, -INF 或 NAN
}

#ifdef __cplusplus
} // extern "C"
#endif

兼容性:

_matherr 和 _matherrl 函数与 _exception_exceptionl 结构体,不是标准 C/C++ 的内容。
C++ Builder 和 Visual C++ 都是用这个方法捕获的 cmath / math.h 函数异常,并且兼容早期版本的 Turbo C/C++ 和 Borland C++。
在 MSDN 里面可以找到这些内容在 Visual C++ 里面应用的描述。

函数 \ C++ Builder 编译器 bcc32 clang32 clang64
_matherr
_matherrl

相关链接:

_exception_mexcepDOMAIN error 定义域错误浮点数异常处理

◤上一页:_exception, _exceptionl下一页:HUGE_VAL, HUGE_VALF, HUGE_VALL, _LHUGE_VAL

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号