在学习《深入理解计算机系统》的浮点数存储里,我想到一个问题,单精度浮点数中,非规格浮点数最大数是几?

00000000011111111111111111111111

符号位:0

指数域:00000000

小数域:11111111111111111111111

指数域全0,小数域全1,符号位0,这个数应该是非规格数中最大的一个了,那么这个数存在吗?计算机是这样存储的吗?

单精度浮点数:符号位1个,指数位8个,小数位23个,偏置值bias=127,E=1-bias=-126,M=f=(0.11111111111111111111111)2

根据存储定义:浮点数V=(-1)sM2E,V=(0.11111111111111111111111)2 * 2-126

让我们开始编程查看一下吧:

#include <cstdio>
int main(){float a=0.5,c=0.5;//第一个for是将a的值累加到(0.111...11),注意0.5在二进制下就是0.1for(int i=0;i<22;i++){c*=0.5;a=a+c;}//第二个for将a和2-126相乘。for(int i=0;i<126;i++){a*=0.5;}unsigned int b=*(int *)&a;for(int i=0;i<32;i++){printf("%d",(b>>(31-i))&1?1:0);}printf("\nb=%d\n",b);return 0;
}

输出:

vagrant@ubuntu-bionic:~$ ./t
00000000011111111111111111111111
b=8388607     //震惊,连b的值都有意义了,8388607=223-1

解释:第一个for中,将循环次数设为22,是因为a本身有一个1,只需再加22个就够了。更有意思的是:如果把次数改为23,则全0,也就是浮点数的0了,如果改为24,那么就是规格数中最小的一个喽,呵呵,有意思,终于理解《深解》说的平滑过渡啥意思了。

那么这个最大的非规格浮点数到底是多少呢?在上面程序加上一句:

printf("%.200f\n",a);

输出:

vagrant@ubuntu-bionic:~$ ./t
00000000011111111111111111111111
a=0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875000000000000000000000000000000000000000000000000000

最后面的0可以删除,这样是为了看着方面,确认没数了。这个数最大的非规格浮点数是:

a=0.00000000000000000000000000000000000001175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875

数字前面有37个0,a*1038约等于1.1755,这还是非规格数里面最大的一个,晕。

那么最小的非规格数是多少呢?基本和前面同理:

#include <cstdio>
int main(){float a=0.5;for(int i=0;i<22;i++){a*=0.5;}for(int i=0;i<126;i++){a*=0.5;}unsigned int b=*(int *)&a;for(int i=0;i<32;i++){printf("%d",(b>>(31-i))&1?1:0);}printf("\na=%.200f\n",a);printf("\nb=%d\n",b);return 0;
}

输出:

vagrant@ubuntu-bionic:~$ ./t1
00000000000000000000000000000001
a=0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125000000000000000000000000000000000000000000000000000b=1

这就是浮点数,如果你懂它,它也很精确的。

转载于:https://www.cnblogs.com/litifeng/p/10488908.html

浮点数存储格式学习:找到非规格数中最大和最小的数相关推荐

  1. python找到列表中最大和最小的数

    def lookup_min_max(numbers):if numbers == []:returnmin_num = numbers[0]max_num = numbers[0]for numbe ...

  2. 寻找神秘4位数:在0-9十个数字中任意选择4个数字,如选2,9,8,4这四个数字,组成最大的数是9842,最小的数是2489,然后相减,再把得到的4位数组成的最大与最小值相减

    寻找神秘4位数:在0-9十个数字中任意选择4个数字,如选2,9,8,4这四个数字,组成最大的数是9842,最小的数是2489,然后相减,再把得到的4位数组成的最大与最小值相减,在这样重复的过程中,你能 ...

  3. c编程:求出4#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。...

    //求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() {int sum=0;int max,mi ...

  4. 计算机视觉与深度学习 | 检测和测量图像中的圆形目标(数钢筋)

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  5. 复杂网络 介数中心性 java_ego network 介数中心性计算

    下面是求节点介数的代码,介数就是指经过一个点的最短路径的比例,在计算复杂网络中节点重要性的时候会用到. /** * 用来计算介数 * 要计算所有的最短路径,用DIJ计算最短路径的时候我们可以发现一个规 ...

  6. Java从键盘输入若干数_用java编程序:从键盘输入若干个整数,输出这些数中大于其平均值的数。...

    展开全部 引用1楼 christal yhy的答案,考虑到浮点数的存在,特在此基础上优化一下,代码如下: public static void main(String[] args) { Scanne ...

  7. 把数组排列成最小的数(详解)

    题目:   输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目解析: ...

  8. (C++)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。

    #include<cstdio> //输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.要求用3个函数实现,分别为输入10个数.进行处理.输出10个数.要求使用指针 ...

  9. 面试题45. 把数组排成最小的数

    题目: 面试题45. 把数组排成最小的数 题解: 1. 题解一: 2. 题解二: * 解题思路:* 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来.关 ...

最新文章

  1. LIVE 预告 | CVPR 2021 预讲 · 旷视专场,覆盖目标检测、蒸馏、图像降噪、人体姿态估计等...
  2. 【Boost】boost库asio详解5——resolver与endpoint使用说明
  3. 选项卡的制作和注意要点
  4. 罗永浩确认12月初开发布会 不是手机也不是电子烟
  5. Qt读取ini文件中文乱码问题
  6. php和fastapi,FastAPI快速开始
  7. MIT App Inventor使用与入门教程
  8. java数组排序方法
  9. 只需简单一步,android自带的示例程序 BluetoothChat 变蓝牙串口助手
  10. 超细节的QT设计完整界面布局的流程-新手向
  11. 细分领域:偏门的色流玩法+简单的色流变现套路
  12. iOS各种证书之间详解关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
  13. 也许你不知道:越自我,越自由!
  14. linux运行directory,我在linux里用命令出来is a directory是怎么回事
  15. Mac突然中文输入法框不见了??
  16. 知到网课异彩纷呈的民族文化期末考试单元试题答案分享!
  17. (三)java流程控制语句
  18. 华特迪士尼宣布媒体和娱乐发行部门亚太区管理团队的一系列任命
  19. SDUSTOJ1670 Problem C: 农夫果园
  20. matlab数字图像实验报告,数字图像处理实验报告(matlab)

热门文章

  1. html将图片做成标签,HTML(图片标签)
  2. java记录每个元素出现几次_哪位师傅帮用Java我计算出数组中每个元素出现的次数...
  3. mysql 去重求总数_Mysql获取去重后的总数
  4. 怎么在html中加判断,css样式里面如何做判断
  5. mysql-connector-net-6.7.4.msi,在ActiveReports中使用MySQL数据库
  6. 【深度学习】CNN在大规模图像数据集上的应用(基于keras和MNIST)
  7. 【Deep Learning笔记】一个很好的神经网络相关定义(看不懂你来打我)
  8. 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(二)
  9. 交互式SQL(数据定义部分)
  10. java API(String类 和 StringBuffer类)