关于浮点数类型和布尔类型的思考

这个问题很多地方都提到了。《高质量C++编程指南》中说了很多了,我也想说一些。
1、关于float和double。记得有一次写一个工控的程序,为了适应数据的大范围,将参数类型选择为double型了。但是测试过程中发现double型的存在误差,如传入的参数为A=1.00000,但是获得的参数值却是A=0.99999999987等这样的数据。后来想到double数据的判断应该使用范围判断,即这么判断:1.00000-Max_Error<A<1.00000+Max_Error,Max_Error是允许的最大误差,其可以将其定义为宏。我要说的问题是:我后来发现float则没有误差。为什么float没有误差呢?至今没有弄明白原因。要说明的是使用double的时候并不是每个数都有误差!有时候是正确的。但是有时候传入的某些值就会有误差。估计和double的内存结构有关!
尽管float没有误差,但是希望以后能养成使用范围比较的习惯。

/************************************/

一般浮点小数是用二进制小数表示的,和整数部分类似,小数也是2的幂次方,

只不过幂次是负数而已。

例如:0.5(10)表示为0.1(2),通俗的说,就是2^-1,也就是1/2,同样:

0.25(10)表示为0.01(2),即2^-2,也就是1/4。对于一个定长的小数,例如

8位二进制小数,其实际的值就是所有位上的值相加而成,例如:

0.75(10)=0.11(2)=1/2+1/4

因此对于像0.1(10)这样的值需要很多值进行相加,设8位二进制小数,那么

0.1(10) 可表示为 0.00011001(2) = 1/16+1/32+1/256 = 0.09765625

或者

0.1(10) 可表示为 0.00011010(2) = 1/16+1/32+1/128 = 0.1015625

由于0.00011001和0.00011010之间已经没有可用的二进制表示了(相对于

8位定长二进制小数来说),因此只能用这两个值来代替0.1,具体取那个根据

实际的舍入规则确定,由此出现了误差。

所以,对于二进制小数来说,只有2的负整数次幂的小数才能够精确表示,否则

就可能出现误差。
/**************************************************************/

2、BOOL和bool类型。其实在C/C++中BOOL定义为:
typedef int     BOOL;
#define FALSE   0
#define TRUE    1
也就是说其实BOOL类型就是int类型,而bool类型则只是有true和false这两个值的一种类型。由于BOOL是int类型的所以,特别的是TRUE在VB中被定义为-1。所以不要在比较的时候将值于TRUE或者1比较,这样比较危险!另外在MFC程序中定义的BOOL类型和bool类型虽然能混用,但是应该注意这两个类型的长度是不一样的,我个人觉得如果是使用MFC编程最好使用BOOL类型的TRUE和FALSE,至少让人觉得风格一致,呵呵!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值