C语言深入理解float

来源:互联网 发布:mac忘记管理员密码 编辑:程序博客网 时间:2024/05/16 09:33

先说说32 位的 float

一个正的浮点数 X, 在计算机中表示为:
         X = a  *  2e   
  这里 代表指数,  a 代表尾数,   在 计算机内部他们都是用二进制表示的其中 用二进制的科学表示法表示由于科学表示法第一位总是1 (0除外) , 所以第一位略去不计.  e 表示的时候因为要表示出负数所以 e要加上127 ,  实际运算的时候要减去127. 

IEEE 规定, 32 位 float型被拆开成以下格式左边为高位

二进制

0

0000 0000

000 0000 0000 0000 0000 0000

位数

1

8

23

含义

符号位

指数位

尾数位

范围

01

-127+127

00x . 7f ff ff

float 的范围是 -3.40282 * e38 ~ + 3.40282 * e38

一般在人看来是 十进制的数要转换成二进制十进制转二进制大于的部分就是除以取余小于的部分乘取整.
 比如 8.5  转换成二进制就是 1000.1 , 处理成这一步还要用科学表示法表示就成了 1.0001 * 23 ,  注意由于1.0001 第一个要去掉所以成了 0001 , 3 需要加上 127 就成了 130 , 二进制就是 10000010。则套用上面话就表示为
     0  10000010 0001 000 0000 0000 0000 0000
     16 进制 就是:   0x 41 08 00 00 , 一般来说 , intel 系列的 CPU 都使用的是 小尾存放就是 高字节放在后面刚好要掉过来就是:   0x 00 00 08 41 , 这样就完成了一次浮点数的表示

注意: 浮点数 0.0  在计算机中表示为 0x 00 00 00 00 .

那么浮点数的精度是怎么回事情呢当我们使用二进制表示 大于的部分的时候没有问题除以2,一直下去最后一位肯定不是就是 0; 那么小数部分呢?  举个例子比如 0.8 
表示    0.8 
             * 2 
            1.6 - 1 = 0.6           
                             * 2 
                             1.2 -1 = 0.2  - 0 
                                            .* 2
                                             0.4 - 0
                                              *2      
                                             0.8 - 0 
这样就循环了 就是说 0.8 的二进制 就是  0.11000 11000 ......  一直循环下去而我们计算机如果表示0.8只能取0后面的前几十位这就说明 如果是  0.800....001 (循环超过100) , 它表示出来的值其实是和 0.8 一样所以我们比较float型的数字 用 a == b 其实是不严谨的(精度问题), 一般都是 用 abs(a - b) < 0.000001 之类就默认是相等.  

那么 double型呢咱们可以照 float 型的葫芦 来画了
double 型 只是说 取 64 float型的位 多一倍

 

IEEE 规定 double 型 
    64             63-54                                                53-1 
   符号位            指数位 ( -1024 - 1024)                    尾数位 

所以 double型的范围是  -1.79769 * e308 ~ +1.79769 * e308
多用了几位表示范围大了很多其实本质跟float型一样.

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ems快递签收人不在怎么办 快递被别人取了怎么办 怎么办快递宗和收发点 快递电话写错了怎么办 网上买沙发想退货怎么办 买的电脑想退货怎么办 买了衣服想退货怎么办 天猫买药审核通过后不要了怎么办 京东维修无发票怎么办 京东维修没有发票怎么办 苹果6s外音没了怎么办 苹果6splus开不了机怎么办 顺丰快递寄件填错收件人地址怎么办 收快递电话换了怎么办 顺丰快递没人收怎么办 网购东西没收到怎么办 中通快递没收到怎么办 快递员不给验货怎么办 顺丰验货不要了怎么办 闲鱼买家掉包了怎么办 闲鱼正在退款中怎么办 拒收货物卖家拒绝退款怎么办 货物没问题淘宝卖家拒收怎么办 头发稀少长的慢怎么办 没满16岁怎么办银行卡 网上买东西手机号填错了怎么办 买东西电话号码填错了怎么办 淘宝联盟扣54分怎么办 联盟被扣54分怎么办 ofo押金退了余额怎么办 网购还没收货就已签收怎么办 理财公司倒闭分公司法人怎么办 公司让离职不想走怎么办 公司让离职自己不想走怎么办 小孩子有购物狂病怎么办 拉杆箱的轮子卡怎么办 想你了怎么办的英文 那现在怎么办 英文怎写 平安证券账号忘了怎么办 发现发票是假的怎么办 公司收到假发票入账了怎么办