浮点数的数据结构

周末在家,重新学习了一下以前不太懂的知识点。浮点数和数据结构。

1 什么是浮点数?

通俗来说带有小数点的数都是浮点数。比如1.1,121.212,-1.11,-222.111

2 在JAVA中常用表示浮点数的类型是什么?区别是什么?

在JAVA中,通常使用的浮点数的类型为 FLoat和Double,他们的区别在于大小与储存方式不同

public class App {
    public static void main(String[] args) {
        System.out.println("Float:"+Float.SIZE);
        System.out.println("Double:"+Double.SIZE);
    }
}
Float:32
Double:64

从这里可以看出FLoat是32位的,Double是64位

Float的储存结构          0        00000000 00000000000000000000000

符号位1     阶数位8      小数位23(8388607(7位十进制)<9999999(7位十进制))所以他的精度是保证6但不到7

Double的储存结构      0        00000000000    0000000000000.。。。。。。。。。。。。。。。。

符号位1     阶数位11     小数位52---------这个就很多了

3 浮点数二进制源码如何转换成对应的FLOAT和DOUBLE的数据结构呢?

这里有几个步骤

step1 得到 二进制浮点数源码 比如1010101.101011011

step2 二进制源码转换为二进制科学计数法1.010101101011011E0110(0110表示<<6)

step3 E0110转换成阶码,如果是FLOAT的阶位转换是0110+1111111(7位)Double的阶位转换是0110+1111111111(10位)

step4 按照浮点数的储存结构来存放咯。

4 做一道例题(摘自网上)

    public static void main(String[] args) {
        float f_v1 = 20;
        float f_v2 = 20.3f;
        float f_v3 = 20.5f;
        double d_v1 = 20d;
        double d_v2 = 20.3d;
        double d_v3 = 20.5d;
        System.out.println(f_v1==d_v1);
        System.out.println(f_v2==d_v2);
        System.out.println(f_v3==d_v3);
    }
true
false
true

第一题和第三题的TRUE的原因是,二进制浮点数的位数比较少,小于Float的23位,所以Float完全能精确到

第二题中的FLASE的原因是,0.3的二进制浮点数是一个无线循环小数,超过了Float的23位,Float进行了截短到23位,而Double有52位,所以2者不相同。

知道了原理后,我们怎么让他变成TRUE呢?

    public static void main(String[] args) {
        float f_v2 = 20.3f;
        double d_v2 = (float)20.3d;
        System.out.println(f_v2==d_v2);
    }
true

很简单,我们去按照Float类型截短一下就OK了。

5 帮助小贴士-如何转换10进制浮点数-->2进制源码

10进制20.3

step1 整数部分 20-->10100

计算过程:

除法    是否有余数

20/2    0

10/2    0

5/2      1

2/2      0

1/2      1

step2 小数部分 0.3-->010011001100。。。

计算过程

0.3*2 = 0.6     0

0.6*2 =  1.2    1

0.2*2 = 0.4     0

0.4*2 = 0.8     0

--------------

0.8*2 = 1.6     1

0.6*2 = 1.2     1

0.2 *2 = 0.4    0

0.4*2 = 0.8     0

--------------

...                  1

...                  1

...                  0

...                  0

step3 整合整数和小数部分 10100.010011001100

如果需要转换成Float或者Double的话,参照上面文中的流程

1 转科学计数法

2 指数部分转换为阶数位(Float是127,Double是1023)

3 按值填入数据结构中

时间: 2024-11-10 11:21:45

浮点数的数据结构的相关文章

ArrayBuffer:类型化数组 (转)

ArrayBuffer:类型化数组 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 分配内存 视图 视图的生成 视图的操作 复合视图 DataView视图 应用 Ajax Canvas File 参考链接 类型化数组是JavaScript操作二进制数据的一个接口. 这要从WebGL项目的诞生说起,所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的.实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式.

Redis 基础数据结构与对象

Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象.列表对象.哈希对象.集合对象和有序结合对象共5种类型的对象. 1 简单动态字符串 redis自定义了简单动态字符串数据结构(sds),并将其作为默认字符串表示. struct sdshdr { unsigned int len; unsigned int free; char buf[

Redis基本数据结构总结

Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我们常说的NoSQL,其并不需要一开始去创建好表结构,可以存储自定义的数据:还有Redis是分布式的,其可以主从分离,主从复制,比如说我们不可能只用一台Redis服务器来处理客户端的请求,因为这样毕竟是存在风险,如果服务器挂掉了,那么其数据就会丢失,而且无法找回,所以存在这么一种方案:多个主服务器用来处理客户端的请求,接着多个Redi

Python的核心数据结构

数据结构 例子 数字 1234,3.1415,3+4j 字符串 'spam'."grace's" 列表 [1,[2,'three'],4] 字典 {'food':'spam','taste':'yum'} 元组 (1,'spam',43,'AB') 文件 file = open('eggs','r') 集合 set('abc'),{'a','b','c'} 其他类型 None,布尔型 数字 数字类型: 整数:没有小数部分的整数 浮点数:后面有小数部分的数字 其他:有虚部的复数.固定精度

计算机中的浮点数(IEEE754)

IEEE读作[a?-'tr?p(?)l-i:],电气和电子工程师协会.这个是一个包括所有电子和计算机技术的专业团体,制定标准是其工作之一. IEEE浮点数算术标准(IEEE 754)是最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用. 整数运算和浮点数运算会有不同的数学属性是因为它们处理数字表示有限性的方式不同——整数的表示算然只能编码一个相对较小的数字范围,但是这种表示是精确的:而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的. IEEE规定的浮点数编码会将一个浮点数转

数据结构与算法二

1.课程安排表: 1. 线性表 2. 字符串 3. 栈和队列 4.树 5.查找 6.排序 7.暴力枚举法 8.广度优先搜索 9.深度优先搜索 10.分治 11.贪心 12.动态规划 13.图 14.数学方法与常见模型 15.大整数运算 16. 基础功能 2.   编程技巧: 1.把较大的数组放在main 函数(全局变量)外,作为全局变量,这样可以防止栈溢出,因为栈的大小是有限制的.GCC (C编译器) 段错误 2.如果能够预估栈,队列的上限,则不要用stack,queue,使用数组来模拟,这样速

【数据结构】什么是数据结构?

绪论 第一个很有意义,又没什么意义的问题:什么是数据结构?? 其实,数据结构在计算机科学界至今没有标准的定义.个人根据各自的理解的不同而有不同的表述方法: Sartaj Sahni在他的<数据结构.算法与应用>一书中称: "数据结构是数据对象,以及存在于该对象的实例合组成实例的数据元素之间的各种联系.这些联系可以通过定义相关的函数来给出." 他将数据对象(data object)定义为"一个数据对象是实例或值的集合".  Clifford A.Shaff

python数据结构与算法 38 分析树

分析树 树的结构完成以后,该是时候看看它能做点什么实事儿了.这一节里,我们研究一下分析树.分析树能够用于真实世界的结构表示,象语法或数学表达式一类的. 图1 一个简单语句的分析树 图1所示是一个简单语句的层级结构,把语句表示为树结构可以让我们用子树来分析句子的组成部分. 图2 ((7+3)?(5?2))的分析树 我们也可以把数学表达式如((7+3)?(5?2))表示为分析树,如图2.此前我们研究过完全括号表达式,这个表达式表达了什么呢?我们知道乘法的优先级比加减要高,但因为括号的关系,在做乘法之

redis 数据结构 (2)

redis不仅仅局限于提供快速的数据存储,此外还提供了大量的功能性操作,为了满足这些功能性操作,redis提供了五种数据存储类型和大量的操作命令. 存储字符串类型 这个是最常规的数据类型,对于一些整数和浮点数redis还提供了自增,自减的操作. 存储链表类型 链表种的每个节点都是一个字符串类型,redis提供了对这个链表的插入,删除等操作. 存储集合类型 集合类型和链表类型的区别是,集合类型是要值唯一,且没有顺序的,redis提供了对集合类型的存取和判断等操作. 存储散列类型 存储健值对的无序散