double的处理和一个不常用的头文件

来源:互联网 发布:前端常用的软件 编辑:程序博客网 时间:2024/04/30 11:00

double类型数值不能直接比较相等情况,因为double中没有严格的相等概念,因此在比较的时候通常要伙同一个EPS(要求的精度)来比较,需要注意的是,比较时是比较上/下届的

 

充分理解下面两组式子就好了:

a < b==>a < b - EPS

a <= b==>a < b + EPS

 

C标准库中还有一个神奇的头文件,float.h,我们并不经常使用它,但是它的作用其实和limits.h类似,都是关于浮点型的各种常量,可以极大的简化我们的工作(同样也有助于移植我们的程序)

 

下面显示了一个通用的比较函数和所有的double的常量(double的比较常用,其余两个都类似,一个是FLT,一个是LDBL)

 

 

其实我对于这个比较函数不是很满意,因为DBL_EPSILON非常之小(在我的机子上大概是2e-16),可能远远超过了我们需要的精度,从而导致过多的计算次数,直接后果是TLE,同样也可能带来错误的答案..

 

注意,这里即使DBL_MAX+DBL_MAX也不会产生错误,因为会得到1.#INF的数值,而这个数值表示无限大,DBL_MAX<1.#INF(不像INT_MAX,一旦溢出直接变成负数了..可恶..)

 

个人建议是仍然自己定义EPS,在充分分析题意的基础上.

 

还要提到一点:目前我做过的关于double的题目,仅有数道要求这样比较大小,大部分都是直接比较就可以的,甚至连相等都可以比较..额..很神奇..如果那样总是WA,要想到先试试dCmp再说..

 

一些细节:浮点数输出有三种形式(默认形式输出的是float)

 

%e/E==>输出科学计数法下的表达

%f==>输出十进制小数的表达

%g/G==>会自动判断e/f哪个比较小,就输出哪个

%lx==>x可以是e/E/f/g/G,输出的类型是double类型

%.nlx==>x同上,n是数字,表示小数点后保留的位数(注意这个数值是已经经过舍入的值,默认是六位)