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

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是数字,表示小数点后保留的位数(注意这个数值是已经经过舍入的值,默认是六位)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值