Float型 与 Double型数据的存储方式
先来了解一下浮点数在计算机中是以什么形式存储的
首先要知道计算机能懂得只有0和1,每一个0和1都占一个位 bit (比特)(Binary Digits):存放一位二进制数,最小的存储单位。
而对于存放一个有小数点的数是如何存储的呢?
对于整数部分,会转换成二进制,使用除2倒取余的方法。
22 / 2 = 11 余0
11 / 2 = 5 余1
5 / 2 = 2 余1
2 / 2 = 1 余0
1 / 2 = 0 余1
22 的二进制转换就是 10110
而对于小数部分,就会乘2取整数的方法。
0.45 * 2 = 0.9 0
0.9 * 2 = 1.8 1
0.8 * 2 = 1.6 1
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.45转化成二进制的时候是无限循环的
二进制转换完成,22.45 --> 10110.011100110......
得到这个二进制浮点数之后,计算机是怎么把他表示为没有小数点的字符呢?
这就用到了小学使用的科学计数法:
10110.011100110 可以写为 1.0110011100110
![]()
过程中我们发现,小数的转换有可能会产生无限循环的情况,想要做的最精确的记录22.45,计算机需要无限大的空间来记录01
那么 IEEE标准 就规定:
32位单精度(java中的float),使用32位(bit)来存储
64位双精度(double), 使用64位储存
在Java中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用4个字节32bit,double数据占用8个字节64bit。
那么它们是如何来分配内存的呢?其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双进度在存储中分为三个部分:
1.符号位(Sign):0代表正,1代表负
2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
3.尾数部分(Mantissa):尾数部分
其中 float 的存储方式如下图所示:

而 double 的存储方式如下:

Float型 与 Double型数据的存储方式的更多相关文章
- c语言中float、double、long double在内存中存储方式
存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m 和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指 ...
- float类型和double类型的二进制存储
在32位环境下, float占用32位,double占用64位, 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和 ...
- <转载>浅谈C/C++的浮点数在内存中的存储方式
C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...
- c/c++浮点数在内存中存储方式
转自:https://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html 任何数据在内存中都是以二进制的形式存储的,例如一个shor ...
- 谈谈Java中整数类型(short int long)的存储方式
在java中的整数类型有四种,分别是byte short in long,本文重点给大家介绍java中的整数类型(short int long),由于byte只是一个字节0或1,在此就不多说了,对ja ...
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- float和double类型的存储方式
Float double 类型在计算机的存储方式 计算机中只认识10的二进制数,那么该如何存储小数呢? 那么我们先看Floa类型: Float在计算机(32位)中是4个字节的,具体地:第一位为符号位0 ...
- float和double在内存中的存储方式
本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgX ...
- 【解惑】剖析float型的内存存储和精度丢失问题
问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 现在我们就详细剖析一下浮点型运算为什么会造成精度丢失? 1.小数的二进制表示问题 首先我们要搞清楚下面两 ...
随机推荐
- Git的小疑惑
①怎么理解Git clone ssh://...git 和 Git remote add [shortname] [url]:Git fetch [shorename];的区别:为什么已经把远 ...
- java.lang.IllegalArgumentException: Invalid character found in the request target. The valid charact
线上环境中部署的 Tomcat 项目,出现部分页面无法打开的情况,但本地环境是好的.经过排查发现,本地 Tomcat版本为 7.0.77,而线上版本为 7.0.88.报错的具体描述为java.lang ...
- PHP 多个字段自增或者自减
//自增$res=Db::name('accessories') ->where('id',$req['id']) ->inc('number',$req['number']) -> ...
- 【java异常】Parsing error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=val
在增删改查的过程中有一个#{ }没有填写
- SimpleDateFormat 中的yyyy-MM-dd HH:mm:ss.SSS说明
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 转换的格式:yyyy是完整的西元年,MM是月份, ...
- Linux下网络socket编程——实现服务器(select)与多个客户端通信
一.关于socket通信 服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定 调用listen()函数监听socket() 函数创建的 ...
- 关于codeforces加载慢
昨天cdx报名cf,打开网页10多分钟才交了.... 今天问了wxy,百度了一下,以前也搜过,然后就忘记了. 今天记一下. 1.右键单击开始按钮,打开资源管理器,在资源管理器的地址栏中填写" ...
- virtualbox安装问题总结
还是老问题 重点重点: https://blog.csdn.net/Loisleen/article/details/84975165#1install_the_gcc_make_perl_packa ...
- 认识随机函数rand()和srand(unsigned int )
rand函数 int rand( void ); 函数名: rand 功 能: 随机数发生器 用 法: int rand(void); 所在头文件: stdlib.h 函数说明 : ...
- Flask项目之login提交
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/11/2 20:53 # @Author : zoulixiang # @Si ...