`
gaopengxiang417
  • 浏览: 21596 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
阅读更多
今天和文龙,法兵讨论float的在计算机中的表示的时候发现我们对其中的一些不是很了解,经过讨论和分析最后终于明白了具体的细节

       我们知道计算机中有两种基本的浮点形式:
1:单精度浮点数:占用32,在java中:float
2:双精度浮点数:占用64位,在java中:double

下面是IEEEE单精度浮点数:
符号位 指数位 尾数位
1(31) 8(23-30) 23(0-22)
(博客)
  0:22 位包含 23 位小数 f,其中第 0 位是小数的最低有效位,第 22 位是最高有效位。
IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。
  23:30 位包含 8 位偏置指数 e,第 23 位是偏置指数的最低有效位,第 30 位是最高有效位。
8 位的指数为可以表达 0 到 255 之间的 256 个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127;偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。在本文中,最小指数和最大指数分别用 emin 和 emax 来表达。稍后将介绍实际的指数值 -127(保存为全0)以及 +128(保存为全 1)保留用作特殊值的处理。
  最高的第 31 位包含符号位s。s为0表示数值为正数,而s为1则表示负数。

9.625为例,
我们转化为二进制格式:1001.101,这个时候计算机会对其进行移位操作,并用指数形式表示
其规范浮点数表达为 1.001101 × 23
按照上面的IEEE的表示方法表示的话可以这样转化:
1, 符号位:由于他是正数,所以符号位为0;
2, 指数位:由于他的指数是23即表示左移了3位,这里要加上一个偏移值127,即130,转化成八位二进制为,1000 0010
3, 尾数位:这里尾数位是1.001101,但是在保存的时候,根据规范小数点左侧必须为1,所以保存的时候可以腾出一个二进制位,所以实际保存的时候是:
0011 0100 0000 0000 0000 000
因此按单精度格式表示为:
0 10000010 00110100000000000000000

这就是在计算机中实际的表示,但是如果我们来手动通过二进制来转换为十进制的话会出现一些问题:
下面就是我们开始的时候计算的方法:
1.符号位是0,所以直接去掉,剩下 10000010 00110100000000000000000
2 指数位转化为十进制130,然后减去偏移值127,得出指数位是3,所以应该是小数位*23
3 我们算出小数位00110100000000000000000的十进制的值(这里我们是直接拉到windows的计算器里进行计算的,所以得出的结果是0.1703936)
4 然后用小数位0.1703936*23 = 1.3631
这时候我们发现算出的结果和原数据相差太大,太坑爹了。这个时候发现我们在把小数位的二进制转化为十进制的时候没有加1
所以算出的小数位应该是1.1703936,这个时候我们用1.1703936*23=9.36314,
但是这个时候算出的结果和原数据也是有偏差的,这个时候我们在想,难道是因为计算机把数据截取了还是windows的计算器不给力。


最后经过一番思考过后,文龙发现了问题,他发现我们对指数位还原为十进制后应该对小数位右移指数位的值,比如:这里算出的指数位的值是3,这样我们就对小数位+1进行右移,
即:1.00110100000000000000000,进行右移3位,右移后为:100.110100000000000000000,这个时候我们把他转化为十进制,这个时候就没问题了,完全还原成了原数据。


后来思考,发现主要的问题在于在二进制和十进制转化时候的移位和小数点前加1两个点上。所以二进制转化为十进制的时候应该首先对二进制进行移位,之后转化成时间值,而不是先把小数位转化为十进制,再乘以指数位。
分享到:
评论

相关推荐

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...

    Java OCR 图像智能字符识别技术,可识别中文

    Java OCR(Optical Character Recognition,光学字符识别)技术是一种计算机视觉领域的应用,它能将图像中的文字转换成可编辑的文本格式。这项技术在各种场景下都有广泛应用,比如文档扫描、车牌识别、发票处理等。...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java电商源代码 java电商源代码

    java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java...

    java api最新7.0

    JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...

    java景点导航系统java景点导航系统

    java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java2Pas Java代码转pas代码

    Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    ### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....

    Java文件管理系统源码.zip

    Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 ...

    smali2java——直接将smali转换成java

    标题"smali2java——直接将smali转换成java"揭示了本文的核心主题,即一个名为"smali2java"的工具,它的主要功能是将编程语言Smali转换为Java。Smali是一种低级的、汇编式的语言,通常用于Android应用的逆向工程,而...

    java2python--java代码转python工具

    Java到Python的转换工具,如标题“java2python”所示,是编程领域中的一种实用技术,旨在帮助开发者将已有的Java代码转换为Python语言。这种转换对于那些熟悉Java但希望进入Python生态系统,或者想要利用Python特定...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java11安装包正式版

    jdk11官方版是一款专为java编程人员推出的软件开发工具。JAVA JDK 11最新版可以帮助用户轻松的获取到JAVA的运行环境,让你在电脑上进行程序开发操作。JAVA JDK 11软件新增Epsilon 垃圾收集器和lambda 参数的局部变量...

    Java1.6.0_26

    JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的...

Global site tag (gtag.js) - Google Analytics