• 浮点数的表示


              浮点数分为单精度(float)和双精度(double),它们的表示方法很特别,区别于整数,我们常用的十进制表示法也有穷尽不能表示的数,更不用说二进制了,那么他们是怎么表示的呢?

              首先要知道11.11(二进制) 这个该怎么换算?  11.11 = 1*2^1+1*2^0+1*2^-1+1*2^-2   以此类推。

              那么计算机表示浮点数,需要三种位模式+两个常数,符号位(1位)+ 阶码位(k位)+ 尾数位(n位) , 一个常数bias作为偏置量,bias=2^(k-1)-1,一个常数是1。1.11*2^4 = 11100 ,1.11*2^-4 = 0.000111   阶码就是指数,小数点后面乘号之前是尾数位,符号位不说了。很简单对吧,但是这里有小细节! 指数并不是单纯的阶码而已,阶码-bias = 指数,我们假定六位浮点数中,k=3,n=2,那么bias=3,随便拿一个数出来,0 110 11,  为了容易看我分开写了,阶码=110=6   指数 = 6-3 = 3; 那尾数位怎么办呢,尾数位=11 最后写出来就是 0.11*2^3 但是这不符合科学计数法标准,所以加一!那么最后结果就是 1.11*2 ^3 = 14  这也是六位浮点数所能表示的最大正数,为什么呢? 110上边还有111呢? 14怎么可能是最大的,事实是阶码 000 和 111 被占用了 用来表示一些特殊的数,所以阶码编码只能从 001 到 110,所以想当然 0 001 11 是最小的负数。

              上面说了 阶码000 和 111 被用来表示一些特殊的数,什么数呢? 还是6位浮点数  011100 表示正无穷; 111100 表示负无穷。当然还有其他的数这里就不说了(本来想画个数轴来表示,会更好一点,可是,不知道怎么画,总不能在纸上画出来用照片截吧=。=)

              觉得还是要补充一点,阶码为00000~的时候,指数应该等于 1-bias,并且尾数位也不用加1了,这样就会算出很多很奇葩的数。。。。

  • 相关阅读:
    spark简单入门
    vim 树形目录插件NERDTree
    Windows下查看系统端口使用的命令
    网络爬虫爬取动态网页
    Java并查集链表实现
    基于mahout的海量数据关联规则挖掘
    高维特征降维方法-随机映射
    JVM(4)--垃圾回收算法
    Java高并发程序设计(六)--线程池(1)
    Java高并发程序设计(五)--ReentrantLock源码解析
  • 原文地址:https://www.cnblogs.com/liboyan/p/4799168.html
Copyright © 2020-2023  润新知