取值范围及精度

可以表示的范围为±3.40282 * 10^38(1.1111…1×2^127)即:

0-11111110-11111111111111111111111(23个1)

单精度浮点数可以表示1.175 * 10-38(1.00…0×2^-126)的数据而不损失精度。

0-00000001-00000000000000000000001(22个0,最后一位是1)

浮点数最小能表示的是当阶码都是0时,表示2^-126*0.fractionbits

ps:以上图片是从 这个网址 截取。

表示方式

  1. 如果指数位全零,尾数位是全零,那就表示0
  2. 如果指数位全零,尾数位是非零,就表示一个很小的数(subnormal),计算方式 (−1)^signbit × 2^−126 × 0.fractionbits(注意这里是0.fractionbits,应该是为了和阶码是-126的时候做出区分,其实也就是比-126的时候能表示的数更小了)
  3. 如果指数位全是1,尾数位是全零,表示正负无穷
  4. 如果指数位全是1,尾数位是非零,表示不是一个数NAN
  5. 剩下的计算方式为 (−1)^signbit × 2^(exponentbits−127) × 1.fractionbits

补码

到底什么是补码,一直到看了 这个知乎回答 之前,我对补码的概念就是反码加一,而且也没有想过到底为什么这样,有什么意义,看完之后才有些恍然大悟。

首先,第一个问题,补码是用来做什么的?

补码是用来方便ALU做减法运算的,因为补码是没有符号的,减一个数相当于加这个数的补码。

所以,第二个问题就是,为什么减一个数相当于加一个数的补码呢?

在回答这个问题之前,首先问一下,如果补码就是简单的反码加一为什么要叫补码,为什么不直接叫反码加一呢,这里就要提出一个概念,叫补数

钟表的例子

这个例子就是补数的直观理解,先假定表盘就表示0-11点,然后现在指针指向2点,如果我想将指针拨到3点有两个办法,第一个是顺时针拨1个格,第二个是逆时针拨11个格,在一个满刻度是12的表盘上,这两个的效果是一样的。抽象来讲,2 - 1 = 2+11

这是为什么呢,这就有个的概念,模,当然数学上有抽象解释,我们这里就可以理解成数的表示极限大小,这里的模就是12,而对于十进制的两位数来说,模就是100。

继续回到 2 - 1 = 2+11 这个问题,因为模是12,所以在这个模下,每个数有其补数,补数的意思就是模减其本身。这里1的补数就是 12 - 1 = 11.而减去一个数,就相当于加上这个数的补数,所以我们得到2 - 1 = 2+11。

再以十进制两位数为例,90 - 10 = 80.10的补数是100-10=90,所以 90 -10 = 90 + 90(忽略百位,因为这里只有两位)。到这里总结一下,一个数的补数 = 模 - 这个数,一个数 - 另一个数 = 一个数 + 这个数的补数

但是如果是10 - 90 怎么办,难道10 - 90 = 10 + 10,-80难道等于20?没错!我们想用数表示-80,却不让加负号,那就直接让-80 = 20。所以,一个负数就用它绝对值的补数来表示

那么,现在的问题是,一个数既可以表示正数又可以表示负数,比如20既可以表示-80也可以表示20,那咋整,就规定0~99,0~49表示整数,50~99表示负数,90就代表-10这种。

实际上

对于浮点数的阶码是8位二进制数,其表示的极限是256(11111111表示255),所以模就是256,根据上面讲过的,将表示范围一分为二:00000001~01111111表示正数,10000000~11111110表示负数(全0和全1有特殊含义)。这样结合上面讲的知识就显而易见了,以10000000为例,256 - |x| = 128.所以表示的x=-128

移码

虽然补码解决了负数的问题,但是补码还是有一定的缺陷,就是比较大小不方便,而进行浮点数运算的时候,有一步是对阶,也就是比较阶码的大小然后再获得浮点数实际大小。为了方便比较大小,浮点数使用移码表示阶码。

移码,顾名思义,就是当前码通过(在坐标轴上)移动之后获得的码,而移动的距离称为偏置(bias)。

为什么移动之后就方便比较大小呢,具体如下图:

不用移码的时候数轴是这样的:

上面是实际的数,而下面是这些数代表的数,也就是上面讲的,254代表-2之类的。

如果我们使得下面的数向右移动一格:

可以看到,现在254代表的是-3了,再移动一格呢:

依次类推,可以一直推到255代表的是最大的正数,这样,就可以直接通过比较码的大小来判断实际值的大小了,是不是很方便呢

不过这里没有考虑全0和全1的情况,但是大概原理就是这样了。

ps:为什么为什么用127做偏置而不是128:据说是为了让数的表示范围对称( 原文 ),但是感觉比较牵强而且也不比用128时对称

半精度与单精度的转换

主要是最近在研究f16和f32的转换才看了上面一堆东西,正题是f16和f32是怎么转换的。

这个就简单了,由上面的知识可以推知,half的表示范围最大也就到65535,而float则很大,因此当half往float转换时,就是指数位转换到指数位,小数位低13位补零。当然考虑到阶码是移码,因此要-15+127才是最终的阶码。同理,从float转换到half也是,阶码-127+15,然后砍掉小数位后13位即可。

这里要注意,如果float原本表示的数超过了half的表示范围,那么转换成的half就是阶码全是1的NaN。

cite:Van Der Zijp J. Fast half float conversions[R]. Working paper, 2012ftp://www. fox-toolkit.org/pub/fasthalffloatconversion. pdf, 2008.

单精度浮点数的取值,表示以及相关相关推荐

  1. 【详细解说】单精度浮点数float取值范围

    结论 先说结论, float能表示范围为:± 3.4e38 最大正数PosMax  3.402e38 最小正数PosMin  1.175e-38 最大负数NegMax  -1.175-38 最小负数N ...

  2. c语言阶码的位数,【判断题】浮点数的取值范围由阶码的位数决定,而精度由尾数的位数决定。 (1.0分)...

    [判断题]浮点数的取值范围由阶码的位数决定,而精度由尾数的位数决定. (1.0分) 更多相关问题 平补肺肾阴阳,兼止血化痰,用于久咳虚喘,劳嗽痰血,为诸痨虚损调补之要药的是A.蛤蚧 B.胡桃仁 C. ...

  3. IEEE754标准中32位、64位浮点数的取值范围

    目录 32位 对于正浮点数 对于零 对于负浮点数 64位 对于正浮点数 对于负浮点数 IEEE标准中用来表示一个浮点数,其中 决定正负号,是尾数,是阶数. 32位 在32位浮点数中,符号位占1位,尾数 ...

  4. Python 浮点数步长取值方法

    import numpy as np for i in np.arange(a,b,0.5):

  5. 详谈单精度浮点数在内存中的存储及其误差问题

    本文主要对单精度浮点数的范围大小进行一些简单的讨论. 分为五部分: 一.单精度浮点数的取值范围 二.单精度浮点数在内存中的存储形式 三.单精度浮点数的范围及其实现原理的关系 四.单精度浮点数在计算中造 ...

  6. python浮点数的范围和精度_python基础教程之C#教程之C#中float的取值范围和精度分析...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文实例分析了C#中float的取值范围和精度.分享给大家供大家参考.具体分析如下: float类型的表现 ...

  7. 带你学C带你飞 | printf函数 | 变量 | 常量和宏定义 | 数据类型 | 取值范围 | 字符串 | 运算符

    文章目录 一.printf函数 1.printf函数 2.printf函数课后作业 二.变量 1.变量 2.变量课后作业 三.常量和宏定义 1.常量和宏定义 2.常量和宏定义的课后作业 四.数据类型 ...

  8. 关于float/double的取值范围、精度和表示

    https://blog.csdn.net/shenziheng1/article/details/79471340 1.float和double的范围和精度 float和double的范围是由指数的 ...

  9. float和double取值范围

    最近在复习的时候发现基础太薄弱,对于float和double虽然了解所占字节数,但不知道他们的取值范围是多少,这对参加大厂笔试题时是十分不利的 1.八种数据类型的分类如下: 第一类:整型 byte s ...

最新文章

  1. genesis cam 最新版_触屏精灵下载_触屏精灵最新版下载[其他行业]
  2. css sprites之圆角
  3. 使用ant进行junit测试
  4. 常见的数据结构——栈、队列、数组、链表和红黑树
  5. RocketMQ专栏
  6. Linux批量部署 EXPECT 使用
  7. SAP Spartacus - Progressive Web Applications,渐进式 Web 应用程序
  8. 计算机什么存放bois程序,[硬件维护]问一个基础性的问题:BIOS程序到底存放在哪个芯片里?...
  9. 后台系统可扩展性学习笔记(十三)缓存
  10. Linux 题目总结
  11. Android 简单闪屏
  12. 在线CSV转Excel工具
  13. 删除数组对象 相同的值 制定数组对象
  14. Python 提示‘Unindent amount does not match previous indent‘解决方法
  15. Java导出Excel表格出现文件损坏异常解决方案
  16. 为Termux安装图形化界面
  17. ios 打开java文件,app开文文献_ios app可以用java开发
  18. 2.1.5 校验码(一文带你分析搞懂:奇偶校验码、海明码、CRC码)
  19. 前端项目中碰到的疑难杂症
  20. 按键精灵脚本编写入门(一)

热门文章

  1. Ventuz 鼠标隐藏功能
  2. jquery制作html小游戏,JQuery手速测试小游戏实现思路详解
  3. JAVA练习小游戏——贪吃蛇小游戏 PLUS版
  4. 很落地的chatgpt应用场景——批量制作抖音爆款带货文案并直接SEO霸屏1 小时前
  5. 微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案
  6. 关于js不生效的问题
  7. 150行JavaScript代码实现增强现实
  8. 微信小程序开发笔记 基础篇②——微信小程序 手动查看和代码查看开发者ID(AppID)
  9. 如何在进行数据库连接到服务器时使用端口号
  10. 详解网商银行“三地五中心”数据部署架构