math.h
众所周知,如果你想使用一些数学函数,那么就需要包含math.h,这里面基本包含了所有常用的数学函数(sin,cos,tan),以及数学常量(PI),等等,既然C库里面开发好了,那我们就看看到底里面都有什么。
既然是数学函数库,首先我们就需要对操作数进行限制,比如0不能作为除数,对负数开方,对负数求对数等等,这些在数学上本身就是不合理的,那如果让计算机去处理这些计算,很可能就会引起错误,因此我们首先就需要明确两个概念inf(infinity)
和nan(not a number)
。
inf
infinity
字面意思是无穷大,这里主要表示数值超过了浮点数的表示范围溢出nan
not a number
字面意思是不是个数字,这就比较奇怪了,难道我用math.h不是为了操作数字吗?其实这里的意思主要是说你进行了未定义的操作,比如上面说的用0作为除数,对负数开方等等
当然这里还有更严格的限制,比如
1、nan == nan
结果是0或false,即不能和nan进行比较,和nan进行比较得到的结果总是false或0。
2、1.0 / 0.0等于inf,-1.0/0.0等于-inf即0.0 + inf = inf。
3、对负数开方sqrt(-1.0)、对负数求对数(log(-1.0))、0.0 / 0.0、0.0 * inf、inf / inf、inf - inf这些操作都会得到nan,但是不同的是0 / 0会产生操作异常而0.0 / 0.0不会产生操作异常,而是会得到nan
4、1.0/inf等于0.0。
5、inf是可以与其他浮点数进行比较的,即可以参与<=、>+、==、!=等运算。
既然有这么多限制,为了方便我们使用,math.h中提供了一系列宏和函数让你可以判断你进行的操作是否是inf,nan或者其他
具体的函数有如下几个
int fpclassify(x);
/* 用来查看浮点数x的情况,fpclassify可以用任何浮点数表达式作为参数。 */
int isfinite(x);
/* 当(fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE)时,此宏得到一个非零值。 */
int isnormal(x);
/* 当(fpclassify(x) == FP_NORMAL)时,此宏得到一个非零值。 */
int isnan(x);
/* 当(fpclassify(x)==FP_NAN)时,此宏返回一个非零值。 */
int isinf(x);
/* 当x是正无穷是返回1,当x是负无穷时返回-1。 */
这些函数的返回值可以用下面这几个宏来表示
FP_NAN: x是一