double比较大小

来源:互联网 发布:sql%rowcount merge 编辑:程序博客网 时间:2024/06/05 08:38

转自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