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的取值范围、精度和表示相关推荐

  1. 为什么Java中float类型的取值范围大于long类型

    在学习Java的过程中,我遇到了一个很有意思的问题,就是为什么Java中float类型的取值范围会大于long类型. 类型名 大小/字节 取值范围 float 4(32bit) -3.4E+38 ~ ...

  2. java double数值范围_Java中float和double的取值范围该怎样理解?

    展开全部 基本类型float占4个字节,二进制位数e5a48de588b662616964757a686964616f31333366306464有32位,取值范围为[-3.4028234663852 ...

  3. java中double_java中float和double的取值范围是什么?

    展开全部 float:4字节(32bit),IEEE 754. 取值范围: [-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.401 ...

  4. java double long 取值_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...

    由一道题引起的思考? java中 long 和double都是64位.为什么double表示的范围大那么多呢? 百度标准答案是这样子的: double是n*2^m(n乘以2的m次方)这种形式存储的,只 ...

  5. C++中int、long和double的取值范围和最大值,以及32位和64位的差异解读

    前言 一般对于C/C++下int等基本数字类型,主要关注三个维度,长度.取值范围和最大值的宏定义.下面分三个维度说明下. 有三个影响因素: 语言规则限制:比如int是变长,long是定长,double ...

  6. Java中short、int、long、float、double的取值范围

    一.基本数据类型的特点,位数,最大值和最小值. 1. 基本类型:short 二进制位数:16 包装类:java.lang.Short 最小值:Short.MIN_VALUE=-32768 (-2的15 ...

  7. java中float和double的取值范围

    float:4字节(32bit),IEEE 754. 范围: [-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.4012984643 ...

  8. float, double 的表示范围和精度

    float:1bit(符号位)+8bits(指数位)+23bits(尾数位) double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位) [尾数是指把一个二进制改写成标准的科 ...

  9. float型y取值在1.0c语言表达式,2011年全国计算机二级C语言模拟试题及答案(14)...

    一.选择题(1-14每题1分,15-18每题1.5分,共20分)1.可选作用户标识符的一组标识符是() AvoidBc5_b8CForD3a Define_53-abDO WORDIFCaseint ...

最新文章

  1. 独家 | 一个好的事件跟踪字典是什么样的?
  2. go 向buff写入一个字节_我在 Go 中犯的 5 个错误
  3. 有感而发,恍然大悟。
  4. Python学习:推导式
  5. 团队作业第4次-项目需求分析
  6. java 时间格式化 星期_Java SimpleDateFormate时间格式化
  7. 51nod 1185 || 51nod 1072 威佐夫博弈
  8. 2016年第3本:启示录----打造用户喜爱的产品
  9. 解析数论 1: Fourier积分和Fourier变换
  10. CMMI4级——几个直接与项目管理相关的PA(PP、PMC、IPM、RSKM、QPM、CAR)
  11. 【C语言】牛顿切线公式计算 a 的立方根 02
  12. LOGO特训营 第四节 字体设计的重要性
  13. 金融货币学笔记(米什金)第二章 金融体系概览
  14. linux的磁盘busy,Linux umount 报 device is busy 的处理方法
  15. 计算机网络.第三节课.笔记.信道复用、频分复用、统计时分复用、波分复用、时分复用、码分复用、双绞线带宽、双绞线
  16. 【论文阅读笔记】Ocean: 目标感知的Anchor-free实时跟踪器,速度70+FPS!刚开源(更新中)
  17. 诛仙手游android转苹果,诛仙手游安卓和iOS互通吗 安卓和iOS能不能一起玩
  18. 惠普电脑调节电脑亮度
  19. python+selenium+pycharm自动化测试环境搭建
  20. php请求纯文本,php – 使用纯文本回退发送HTML简报

热门文章

  1. 友元函数和友元类的应用
  2. pandas读文件UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 17: invalid start byte
  3. 用form表单提交方式上传图片到服务器
  4. Button按钮提交form表单
  5. 盘点科技巨头入场隐私计算
  6. veth pair上的两个ip能否ping通?
  7. iOS APP功能测试(个人总结完整版)
  8. 【OpenCV学习】第9课:形态学操作的应用-提取水平线丶垂直线
  9. 超级大乐透中奖小算法
  10. 华为mate10手机听筒测试软件,【华为Mate10评测】通讯:终于可以一边电话一边游戏_华为 Mate 10保时捷版_手机评测-中关村在线...