梦中江湖

世间一切皆为江湖,世间一切皆不为江湖。曾经年少,觉得一切皆是那么美好,世间事物一切皆可为我所有,天下之大皆我可往。有一种江湖的情结,豪情满胸。可是时间的流逝,年龄的增长,心中的江湖已经不在,现在江湖泛滥,唯有小酌入梦后,才能在梦中再见我的江湖!再见我的青春!

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  12 随笔 :: 0 文章 :: 15 评论 :: 0 Trackbacks

这个问题很多地方都提到了。《高质量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,至少让人觉得风格一致,呵呵!


posted on 2005-06-20 09:07 梦中江湖 阅读(1371) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。