现在的位置: 首页 > 综合 > 正文

double比较大小

2017年12月14日 ⁄ 综合 ⁄ 共 878字 ⁄ 字号 评论关闭

转自http://www.cnblogs.com/taoxu0903/archive/2011/03/11/1981389.html

参考:

Comparing
floating point numbers 
 

总结几点:

0. float占4byte,精度是6~7位;double占8byte,精度是15~16位。 

1. 因为double类型或float类型都是有精度的,其实都是取的近似值,所以有个误差。和一个很小的数比如0.00000001(1e-8)比较就是为了在这个误差范围内进行比较。

举个例子如double b = 0.123456可能是0.1234561的四舍五入后得到的结果。最后的0.0000001就表示误差范围了。 
无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式 。
double 与 0 比较:
doubel a; 
if ( a>-0.000001 && a< 0.000001 )对。 
而 if( a == 0 )不对! 

2. C/C++的浮点数据类型有float和double两种。它们在内存中是以科学计数法的结果来存储的。 

类型float大小为4字节,即32位,内存中的存储方式如下:



 符号位(1 bit)


指数(8 bit)


尾数(23 bit)



类型double大小为8字节,即64位,内存布局如下:



符号位(1 bit)


指数(11 bit)


尾数(52 bit)

  

符号位决定浮点数的正负,0正1负。 

指数和尾数均从浮点数的二进制科学计数形式中获取。

3. 关于比较大小

一般情况下用一个absolute epsilon value来比较(if (fabs(result
- expectedResult) < 0.00001)
)就够了。但是在某些对数字精度有特殊要求的domain,比如graphic,需要用更合理的方法。具体,参见引用文献2.

Comparing for equality

Comparing with epsilon – absolute error

Comparing with epsilon – relative error



抱歉!评论已关闭.