double精度问题,数据范围

浮点数在计算机中存储方式  http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html

1. double:
  1bit(符号位) 11bits(指数位) 52bits(尾数位)

浮点数的十进制形式是,即十进制的科学计数法: a.xxx *10^n,

而在计算机中是用二进制的科学计数法表示:1.xxx * 2^n(*是二进制乘法 即移位)

指数位用来表示了n,尾数位表示的是小数部分xxx。

比如 8.25 ,二进制 100.01 ->1.0001*2^2

而指数有正负,所以double型最大值是2^1024 =  1.79E+308 ,比64位uint64_t 要大多了 ,这是因为损失了数据精度的:

      uint64_t最大值转为double型:64bit的1->1.111(52个)*2^63 (在vs中实际转换后表示成了1.00*2^64,应该是因为最后11个bit 进了一位),

而完整无损失的表示应该是:1.111(52个)111(11个)*2^63

      因为double的尾数只有52bit,所以后面的11bit的1是损失了的,整数 (1<<64)-1 到 (1<<64)-1 -( (1<<11) -1) 转换成double时是一样的结果

(vs调试中考虑了四舍五入,(1<<64)-1 到 (1<<64)-1 -( (1<<10) -1 转换结果一样)

也就是说64bit的整数,用double表示,(考虑四舍五入)误差可达1023(即double的分辨率只有1023,或许double a 与 a+1023 相等)

63bit 误差可达511 ....  ,54bit误差可达1,不超过53bit时,用double表示才没有误差。

原文地址:https://www.cnblogs.com/mlj318/p/4917411.html