C 标准库系列之float.h
float.h 内部主要包含了一系列的浮点数宏、指明可移植程序必要的常量;浮点数格式一般为Spxbe;其中S表示+-;p表示底数、b表示基数如2、8、10、16等进制,e为指数标识E或e;
在一般情况下可以直接使用该头文件中宏定义的值。
glibc下没有专门针对float.h的文件,其一般以stdlib.h或者其他文件替代。
微软的float.h提供了各个浮点数宏,包括要求的最大值、最小值、精度等,其中以DBL开头的宏表示double类型,FLT开头的则float类型的,此外还有LDBL开头的,即long double类型
在不同平台或处理器下可能有不同的值范围,比如#define DBL_MAX 1.7976931348623158e+308,#define FLT_MAX 3.402823466e+38F,#define DBL_DIG 15,#define FLT_DIG 6分别为双精度和单精度浮点数最大值,以及双精度和单精度的有效位为15位、6位,在一般的应用中单精度便足够了并且节省内存占用。
微软还提供了获取或者改变浮点控制字的几个函数,如_controlfp、_clearfp、_set_controlfp、_statusfp、_fpreset等,这些函数控制字使程序能够根据不同的平台改变精度,舍入;
__fpecode:获取浮点错误信号、返回码,其以_FPE_XXX开头的宏定义值,比如_FPE_INVALID无效值、_FPE_OVERFLOW溢出值:此外也提供了IEEE 推荐的函数,这些函数参数针对double类型;
如:
double _copysign(double x,double y):以第二个参数的正负符号返回第一个参数x的值;
double _chgsign(double x):返回该数值的正负号变换后的值(正变为负,负变为正);
double _scalb(double x,double y):以2的幂缩放自变量,即返回值为x * 2的y次方;
double _logb(double x):返回x值的2为底数的指数值;如_logb(8.0)返回3.0
double _nextafter(double x,double y):返回x在y方向上可以表示的最接近的数值,若x等于y,则返回y;
int _finite(double x):判断x是否为有效浮点数,比如非无穷大的,当x为infinite或者NaN时返回false(0),否则返回true(非0值);
int _isnan(double x):判断x是否为非数值;若非数值则返回true(非0),否则返回false(0);
int _fpclass(double x):返回浮点数值的类型,这些返回值被以_FPCLASS_XXX宏定义的值。
glibc中也有提供IEEE 推荐的函数,不过函数命名不同且存放在math.h文件中,形如:isnan、isinf、isnormal、isfinite、fpclassify、copysign、scalb、logb等。