float和double的内存布局

http://www.cnblogs.com/yaozhongxiao/archive/2010/09/08/1821185.html

http://blog.csdn.net/demon__hunter/article/details/3566232

已经有人写好了,我就不写了。

一个人,只认识二进制,他要表达十进制中的9,需要写成1001,换算公式为1*2^3+0*2^2+0*2^1+1*2^0=9。

他要表达十进制中的9.5,需要写成1001.1,换算公式为1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)=9.5。

如果有一个二进制为1001.1001,它是十进制中的1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)+0*2^(-2)+0*2^(-3)+1*2^(-4)=9.5625。

=========================================

double占64bit,其中符号位1位,指数位11位,小数部分52位,指数偏移量是1023。
小数部分是指【yyy.xxx】,其中xxx是52个零壹字符串。
当偏移量为正值(大于0)时,小数点右移偏移量个位置。
当偏移量为负值(小于0)时,小数点左移偏移量个位置。
当偏移量为0时,小数位的值=(0/1)*2^(-1)+(0/1)*2^(-2)+(0/1)*2^(-3)+...+(0/1)*2^(-52)。
当我们把2^(-52)作为一个单位时,小数位的值就是xxx(共52个x的零壹字符串)个单位。
所以,小数位的值value=multiple*2^(-52)。
所以multiple=value*2^52。
因为2^52=......370500,所以,value为0.01的倍数的时候,multiple都是整数。
所以,double可以完美的表示所有的两位小数。
但是double d=17.7时,VS2013显示的是17.699999999999999,这很令人诧异。

====================================

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值