关于float/double的取值范围、精度和表示
https://blog.csdn.net/shenziheng1/article/details/79471340
1.float和double的范围和精度
float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:
float:1bit(符号位)+8bits(指数位+23bits(尾数位)
double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)
在数学中,特别是在计算机相关的数字(浮点数)问题的表述中,有一个基本表达法:
value of floating-point = significand x base ^ exponent , with sign --- F.1
译为中文表达即为:
(浮点)数值 = 尾数 × 底数 ^ 指数,(附加正负号)---------------- F.2
于是,float的指数范围为-127~128,而double的指数范围为-1023~1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,共七位,意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
2.C#/C++对于浮点数的存储
C 语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
1.符号位(Sign) : 0代表正,1代表为负
2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
3.尾数部分(Mantissa):尾数部分
2.1 float / double的存储方式
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*10e0,而120.5可以表示为:1.205*10e2, 。而计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数 法表示,8.25用二进制表示可表示为1000.01。120.5用二进制表示为:1110110.1用 二进制的科学计数法表示1000.01可以表示为1.0001*2e3,1110110.1可以表示为1.1101101*2e6,任何一个数都的科学计数法表示都为1.xxx*2en, 尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点, 24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以 指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。
2.2 实例解析
首先看下8.25,用二进制的科学计数法表示为:1.0001*2e3。按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,尾数部分0001,故8.25的存储方式如下图所示:
而单精度浮点数120.5的存储方式如下图所示:
关于float/double的取值范围、精度和表示相关推荐
- 为什么Java中float类型的取值范围大于long类型
在学习Java的过程中,我遇到了一个很有意思的问题,就是为什么Java中float类型的取值范围会大于long类型. 类型名 大小/字节 取值范围 float 4(32bit) -3.4E+38 ~ ...
- java double数值范围_Java中float和double的取值范围该怎样理解?
展开全部 基本类型float占4个字节,二进制位数e5a48de588b662616964757a686964616f31333366306464有32位,取值范围为[-3.4028234663852 ...
- java中double_java中float和double的取值范围是什么?
展开全部 float:4字节(32bit),IEEE 754. 取值范围: [-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.401 ...
- java double long 取值_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...
由一道题引起的思考? java中 long 和double都是64位.为什么double表示的范围大那么多呢? 百度标准答案是这样子的: double是n*2^m(n乘以2的m次方)这种形式存储的,只 ...
- C++中int、long和double的取值范围和最大值,以及32位和64位的差异解读
前言 一般对于C/C++下int等基本数字类型,主要关注三个维度,长度.取值范围和最大值的宏定义.下面分三个维度说明下. 有三个影响因素: 语言规则限制:比如int是变长,long是定长,double ...
- Java中short、int、long、float、double的取值范围
一.基本数据类型的特点,位数,最大值和最小值. 1. 基本类型:short 二进制位数:16 包装类:java.lang.Short 最小值:Short.MIN_VALUE=-32768 (-2的15 ...
- java中float和double的取值范围
float:4字节(32bit),IEEE 754. 范围: [-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.4012984643 ...
- float, double 的表示范围和精度
float:1bit(符号位)+8bits(指数位)+23bits(尾数位) double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位) [尾数是指把一个二进制改写成标准的科 ...
- float型y取值在1.0c语言表达式,2011年全国计算机二级C语言模拟试题及答案(14)...
一.选择题(1-14每题1分,15-18每题1.5分,共20分)1.可选作用户标识符的一组标识符是() AvoidBc5_b8CForD3a Define_53-abDO WORDIFCaseint ...
最新文章
- 独家 | 一个好的事件跟踪字典是什么样的?
- go 向buff写入一个字节_我在 Go 中犯的 5 个错误
- 有感而发,恍然大悟。
- Python学习:推导式
- 团队作业第4次-项目需求分析
- java 时间格式化 星期_Java SimpleDateFormate时间格式化
- 51nod 1185 || 51nod 1072 威佐夫博弈
- 2016年第3本:启示录----打造用户喜爱的产品
- 解析数论 1: Fourier积分和Fourier变换
- CMMI4级——几个直接与项目管理相关的PA(PP、PMC、IPM、RSKM、QPM、CAR)
- 【C语言】牛顿切线公式计算 a 的立方根 02
- LOGO特训营 第四节 字体设计的重要性
- 金融货币学笔记(米什金)第二章 金融体系概览
- linux的磁盘busy,Linux umount 报 device is busy 的处理方法
- 计算机网络.第三节课.笔记.信道复用、频分复用、统计时分复用、波分复用、时分复用、码分复用、双绞线带宽、双绞线
- 【论文阅读笔记】Ocean: 目标感知的Anchor-free实时跟踪器,速度70+FPS!刚开源(更新中)
- 诛仙手游android转苹果,诛仙手游安卓和iOS互通吗 安卓和iOS能不能一起玩
- 惠普电脑调节电脑亮度
- python+selenium+pycharm自动化测试环境搭建
- php请求纯文本,php – 使用纯文本回退发送HTML简报
热门文章
- 友元函数和友元类的应用
- pandas读文件UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 17: invalid start byte
- 用form表单提交方式上传图片到服务器
- Button按钮提交form表单
- 盘点科技巨头入场隐私计算
- veth pair上的两个ip能否ping通?
- iOS APP功能测试(个人总结完整版)
- 【OpenCV学习】第9课:形态学操作的应用-提取水平线丶垂直线
- 超级大乐透中奖小算法
- 华为mate10手机听筒测试软件,【华为Mate10评测】通讯:终于可以一边电话一边游戏_华为 Mate 10保时捷版_手机评测-中关村在线...