首先说一下:

范围是3.4E-38 ——3.4E+38,可提供7位有效数字。 
上述这两个量都是近似值,各个编译器不太一样的。

下面我就将标准值是怎么定义的,和你说一下: 
这个比较复杂,建议你找一下IEEE754标准看一下。

https://ieeexplore.ieee.org/document/4610935

其中,s 表示 sign,即符号。如果 s == 0,则浮点数 V 为正;如果 s == 1,则浮点数 V 为负。

M 表示有效数字,在 [1, 2) 之间。

而 E 则是指数位。

这个很熟悉吧,小学学习的科学技术是不是这样子。

这个简单说一下吧: 
在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,double有64bit。它们的构成包括符号位指数位尾数位。 
这些位的构成如下:

float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)


double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)

取值范围主要看指数部分: 
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。 
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。 
由于float的指数部分对应的指数范围为-128~128,所以取值范围为: 
-2^128到2^128,约等于-3.4E38 — +3.4E38

精度(有效数字)主要看尾数位: 
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位

对于 32 位浮点数,可以准确表示的精度在 10^-6 这个量级。换句话说,如果我们想要表示的小数,在小数点后 7 位还有有效数字的话,32 位的浮点数就不能精确表示了。

对于 64 位浮点数,可以准确表示的精度在 10^-15 这个量级。换句话说,如果我们想要表示的小数,在小数点后 16 位还有有效数字的话,64 位的浮点数就不能精确表示了。

虽然,对于大多数情况,这个精度范围足够用了。但是,在很多应用领域,我们还是要小心:当使用计算机表示浮点数的时候,因为精度的限制,可能引发严重的问题,甚至是巨大的灾难。

1991 年海湾战争中,伊拉克的一枚飞毛腿导弹,击中了美军驻扎在沙地阿拉伯 达兰市的一个兵营。这枚导弹造成了美军 28 人死亡,260 人受伤。这个死亡人数,近乎等于美军在整个海湾战争过程中牺牲人数的三分之一。

问题是,美军已经在达兰市部署了大名鼎鼎的爱国者反导弹防御系统。但是,这个防御系统却没有对这枚飞毛腿导弹进行拦截。为什么?问题就出在浮点数上。

事后的研究发现,爱国者防御系统在时间记录上,因为浮点数的精度问题,产生了 0.000000095 秒的误差。然而,就是这 0.000000095 秒的时间,面对飞速运行的导弹,转化成距离,误差被放大到了 573 米。也就是,爱国者防御系统误以为导弹还在 573 米外,尚未对军营造成威胁,因而没有进行拦截。


并非所有的灾难都是因为精度问题。还有一些灾难,是因为错误地处理浮点数。

最典型的例子,就是在程序中,很有可能会错把浮点数当做整型用。不管是浮点数也好,整型也好,字符也好,在计算机中,都是一串二进制。变量的类型,决定了计算机怎么解析这样一串二进制。不经意间,如果错误地让计算机把原本是浮点数的变量解析成整型,就会产生 bug。

1996 年 6 月,欧洲宇航局发射了无人航天器 阿丽亚娜 5 号。阿丽亚娜 5 号在发射 39 秒后爆炸。

这个航天器花费了 10 年时间进行研发,总投资额达 70 亿美元。与此同时,航天器上载有四个科学卫星,总价值达 5 亿美元。这一切,都在阿丽亚娜 5 号发射 39 秒钟以后,烟消云散。

后续,在进行事故调查的时候,发现是程序中一个极其简单,但同时也是一个极其不易察觉的错误引发的问题:程序中的某一处,将表示航天器水平速度的变量——一个浮点数,错误地当做整型使用了。这使得航天器在升空的过程中,水平方向的速度虽然近乎为 0,却被计算机认为具有一个非常高的水平速度,从而,引发了不正确的自动措施,最终导致整个航天器的爆炸。

还有一些关于浮点数的 bug,来自四舍五入的过程中。

德国的选举法规定,一个选举人要获得至少 5% 的选票,才能在立法机构赢得一席之地。1992 年 4 月的德国选举过程中,绿党的一名候选人获得了整整 5% 的支持票数。然而,事后的调查发现,这名候选人的真正得票率不是 5%,而是 4.97%。统计选票程序使用了 round() 函数,对 4.97 进行了四舍五入,最终得到了 5% 的结果。但这和选举规则是不符合的。选举规则规定:4.97%,也是不足 5% 的。只不过在之前的选举中,没有出现过这种情况,使得人们一直忽视了这个 bug 的存在。后来,人们重新计算投票后,将这名候选人“踢出”了立法机构。这使得德国社会民主党多了一名候选人。而这一人之差,使得当届,德国的社会民主党赢得了议会上的多数席位。

另一个故事,发生在 1980 年的加拿大温哥华。

当年,温哥华的股票交易所发现,某个指数基金的总价值在奇怪地不断蒸发。事后调查显示,这是因为这个指数基金的交易程序中,对于金钱,使用 floor() 函数的方式,抹去了“分”之后的所有价值。所以,如果你花了 1234.567 元购买这个基金,最后的 0.007 元,即 0.7 分就被抹去了,相当于交易所少收了 7 厘。这 7 厘的价值,对于个人来说并不重要。但是,对于整个交易所来说,每天数百万次的交易,在积累一段时间以后,就变成了一个不得了的数字。随着计算机系统深入到我们生活的方方面面,很多 bug 真的不仅仅是一个小 bug 那么简单了。它们可能对人类的生活产生真实的影响,甚至是生命的代价。

所以...

对于大多数程序员的日常,可能还是这样子的吧。

Float的取值范围相关推荐

  1. double取值范围 java_Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

  2. float 范围 java_Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

  3. Float的取值范围及存储结构

    Float的取值范围 写文章-CSDN博客https://mp.csdn.net/mp_blog/creation/editor/120832448 Float的存储结构 浮点数在机内用指数型式表示, ...

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

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

  5. C#中float的取值范围和精度分析

    float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: float x = 3.5F; 如果在以上声明中 ...

  6. CSS定位布局display/float/position属性之间的关系/区别和如何使用取值行为机制

    float: left|right; 可以自动排列自动折行, 但需要clear来配合清除浮动; display: inline-block; 有些时候可以替代float实现相同的效果. positio ...

  7. float的精度和取值范围

    文章目录 前言 精度限制 float存储方式 float存储示例 float范围 float精度 float小数 float特殊值 总结 前言 关于float的精度和取值范围这个问题,我查询了很多次, ...

  8. float和double的精度和取值范围计算方法

    C/C++各数据类型大小和取值范围 类型名称 字节数 取值范围 signed char 1 -2^7(-128) ~ 2^7-1(127) unsigned char 1 0 ~ 2^8-1(255) ...

  9. 解说float取值范围计算过程

    1.先给出实型变量取值范围 实型变量可以分为单精度(float)(4字节).双精度(double)(8字节).长双精度(long double)(8字节)三种类型. 在 VC6.0 double和lo ...

最新文章

  1. 老p7,来阿里快十年了,怎么着资产都上千万了,但是过的无比拮据
  2. Android native 开发总结
  3. [转]C#开发ActiveX控件,.NET开发OCX控件案例
  4. UTXO与账户/余额模型
  5. 机器视觉与深度神经网络—洗去浮华,一窥珠玑
  6. windows API函数copyfile
  7. mysql数据库分表备份脚本_mysql 分库分表备份脚本
  8. linux8安装bbr_CentOS 7安装4.9内核开启BBR
  9. linux 命令详解 十六
  10. EFK6.3+kafka+logstash日志分析平台集群
  11. ros control
  12. 60.Linux:虚拟机安装及基本操作
  13. 串口485接法图_rs485接口接线怎样操作?
  14. 管理信息系统——决策表例题
  15. 批量修改文件夹下所有文件名称
  16. 使用BootStrap.编写网页
  17. 记一次jstack线程诊断
  18. chromecast 协议_因此,您刚刚获得了Chromecast。 怎么办?
  19. 淘口令卡首屏直通车卡首屏关键词刷单技术分享
  20. Vin码采集,Vin码录入

热门文章

  1. 【文献学习】Complex-Valued Convolutions for Modulation Recognition using Deep Learning
  2. 与语音信号处理有关的java书籍_MATLAB在语音信号分析与合成中的应用 中文pdf扫描版[198MB]...
  3. cmd命令查看路由器上记录的IP地址与MAC地址(ARP表)
  4. 【论文】多核实时操作系统的确定性调度设计
  5. 第三方API接口对接-电子合同的实现逻辑
  6. RK3588快速上手 | 01-RK3588开发板快速上手
  7. Log4j日志框架介绍
  8. 表单实现登录注册功能
  9. selenium必应搜索,获取标题以及url
  10. HTML中<img src=““>中图片路径的用法