MATH_ERROR - Linux手册页

时间:2019-08-20 18:01:59  来源:igfitidea点击:

Linux程序员手册 第7部分
更新日期: 2017-09-15

名称

math_error-从数学函数中检测错误

语法

#include <math.h>
#include <errno.h>
#include <fenv.h>

说明

发生错误时,大多数库函数都会通过返回一个特殊值(例如-1或NULL)来表明这一事实。因为它们通常返回浮点数,所以使用其他机制声明的数学函数表示错误。错误报告机制有两种:旧的设置errno;第二个设置errno。较新的版本使用fenv(3)中描述的浮点异常机制(使用feclearexcept(3)和fetestexcept(3),如下所述)。

需要检查数学函数错误的可移植程序应将errno设置为零,并进行以下调用

feclearexcept(FE_ALL_EXCEPT);

在调用数学函数之前。

从数学函数返回时,如果errno为非零,或者随后的调用(请参阅fenv(3))返回非零

fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW |
             FE_UNDERFLOW);

则数学函数发生错误。

下面介绍数学函数可能发生的错误条件。

Domain error

当为数学函数提供参数值超出其定义域的参数时(例如,为log(3)赋予负参数),就会发生域错误。当发生域错误时,数学函数通常返回NaN(尽管在某些情况下某些函数返回不同的值)。 errno设置为EDOM,并引发"无效"(FE_INVALID)浮点异常。

Pole error

当函数的数学结果为精确无穷大时(例如,对数0为负无穷大),就会发生极点误差。发生极点错误时,函数将根据函数结果类型是double,float还是long double来返回(有符号)值HUGE_VAL,HUGE_VALF或HUGE_VALL。结果的符号是该函数在数学上正确的符号。 errno设置为ERANGE,并引发"零除"(FE_DIVBYZERO)浮点异常。

Range error

当函数结果的大小表示无法在函数的结果类型中表示时,会发生范围误差。函数的返回值取决于范围错误是上溢还是下溢。

如果结果是有限的,则浮动结果会溢出,但是太大而无法在结果类型中表示。发生溢出时,函数将返回值HUGE_VAL,HUGE_VALF或HUGE_VALL,具体取决于函数结果类型是double,float还是long double。 errno设置为ERANGE,并引发"溢出"(FE_OVERFLOW)浮点异常。

如果结果太小而无法在结果类型中表示,则浮动结果会下溢。如果发生下溢,则数学函数通常返回0.0(C99说一个函数应返回"实现定义的值,其大小不大于指定类型中的最小归一化正数")。 errno可能设置为ERANGE,并且可能引发"下溢"(FE_UNDERFLOW)浮点异常。

如果提供的参数值或正确的函数结果不正常,则某些函数会产生范围错误。次正态值是一个非零值,但大小太小以致于不能以规范化形式显示(即,有效数的最高有效位为1)。次普通数的表示形式将在有效位数中包含一个或多个前导零。

备注

glibc不支持C99和POSIX.1指定的math_errhandling标识符。假定该标识符指示正在使用两种错误通知机制(errno,可通过fetestexcept(3)检索的异常)中的哪一种。这些标准要求至少使用一种,但允许两者均可用。 glibc下的当前(2.8版)情况比较混乱。大多数(但不是全部)函数都会引发错误异常。有些还设置了errno。一些函数设置了errno,但没有引发异常。很少有功能不起作用。有关详细信息,请参见各个手册页。

为了避免使用errno和fetestexcept(3)进行错误检查的复杂性,通常建议人们在每次调用之前都应检查错误的参数值。例如,以下代码确保log(3)的参数不是NaN且不为零(极点错误)或小于零(域错误):

double x, r;

if (isnan(x) || islessequal(x, 0)) {
    /* Deal with NaN / pole error / domain error */
}

r = log(x);

本页上的讨论不适用于复杂的数学函数(即由声明的函数),通常C99和POSIX.1不需要返回复杂的数学函数。

gcc(1)-fno-math-errno选项使可执行文件采用某些数学函数的实现,这些实现比标准实现要快,但不会在出错时设置errno。 (gcc(1)-ffast-math选项还启用了-fno-math-errno。)使用fetestexcept(3)仍可以测试错误。

另外参见

gcc(1),errno(3),fenv(3),fpclassify(3),INFINITY(3),isgreater(3),matherr(3),nan(3)

信息库

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/