关于float的小奥秘
一. float 存储方式
1.1. float 占四个字节
1.2. 浮点数构成
1.2.1. 无论是单精度还是双精度在存储中都分为三个部分:
<1>. 符号位(Sign) : 0代表正,1代表为负
<2>. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储(范围-127-128)
<3>. 尾数部分(Mantissa):尾数部分
a. 其中float的存储方式如下图所示:

b. 而双精度的存储方式为:

二. 浮点数计算方式
2.1. 比如8.25用十进制的科学计数法表示就为:8.25*
,而120.5可以表示为:1.205*
,这些小学的知识就不用多说了吧。
但计算机只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,(我靠,不会连这都不会转换吧?那我估计要没辙了。小数点左边表示
,右边是
)。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为1.0001*
,1110110.1可以表示为1.1101101*
,任何一个数都的科学计数法表示都为1.xxx*
,尾数部分就可以表示为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*
2.2.1. 按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130(至于为啥加127看后面) ,位数部分为,故8.25的存储方式如下图所示

2.2.2. 单精度浮点数120.5的存储方式如下图所示:

三. 为啥加127
3.1.


3.1. 上面的例子中,我们知道E代表的是幂的大小,而存入计算机的e则为E+127,那么问题来了,这里为什么要加上127这个数呢?
<1>.

<2>. 其实,也就是说:计算机表示单精度浮点数时,是用8位去存储指数部分,在数值上面,表示0~255,但是我们同样需要有负指数,正负指数的位数量为了均等,各自一半,-127~128,0是特殊点,特殊处理。储存时候会加上127,这样就刚刚好是0~255,就能很好的储存了,不然的话,需要判断符号位来判断数值的正负(计算机把指数拿去-127就可以得到正负)
面试题:
请写出float x 与“零值”比较的if语句
答案:
const float EPSINON = 0.00001;
if((x>=-EPSINON)&&(x<=EPSINON));
关于float的小奥秘的更多相关文章
- 关于CSS中的float可能出现的小问题
关于CSS中的float可能出现的小问题 前言:最近学习CSS的float所遇到点小问题,然后顺便分享给大家. 一.什么是CSS以及float (一) CSS概述 CSS是层叠样式表(英文全称:Cas ...
- 多用多学之Java中的Set,List,Map
很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...
- what is difference in (int)a,(int&)a,&a,int(&a) ?
This interview question come from a famous communication firm of china. : ) #include <iostream> ...
- js实现省市区联动
先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...
- Launcher知识的demo,手机管家小伙家与悬浮窗
Launcher知识的demo.主要仿的手机管家小伙家与悬浮窗的效果.东西比較简单.直接贴代码 主要用到了windowManager 中的更新updateViewLayout(view,params) ...
- 2、原生js实现轮播图特效
很多很多网站经常会用到一个特效,那就是轮播图,对于日新月异的前端技术来说其实就是一个框架一个接口的事,但轮播的原理是什么?用最原始的javascript来写又是怎样的呢?本人是一枚菜鸟,这篇文章就当做 ...
- mysql的char,varchar,text,blob
mysql的char,varchar,text,blob是几个有联系但是有有很大区别的字段类型,这算是mysql的基础吧,可是基础没有学好,恶补一下. 先简单的总结一下: char:定长,最大255个 ...
- Android,TextView的所有属性和方法
XML 属性 属性名称 相关方法 描述 android:autoLink setAutoLinkMask(int) 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接. ...
- 3-3 浮点型字面量 & 3-4浮点型案例
双精度的浮点类型,末尾加d或者D 3-4浮点型案例 如果一个浮点类型的末尾什么也不写 他表示就是一个double类型的.所以这里定义报错了. float f=1234.328; 把一个范围大的数赋值给 ...
随机推荐
- 关系型数据库(四),引擎MyISAM和InnoDB
目录 1.MyISAM和InnoDB关于锁方面的区别是什么 2.MYSQL的两个常用存储引擎 3.MyISAM应用场景 4.InnoDB适合场景 四.引擎MyISAM和InnoDB 1.MyISAM和 ...
- Nowcoder Playing Games ( FWT 优化 DP && 博弈论 && 线性基)
题目链接 题意 : 给出 N 个数.然后问你最多取出多少石子使得在 NIM 博弈中.后手必胜 分析 : Nim 博弈模型,后手必胜当且仅当各个堆的石子的数目的异或和为 0 转化一下.变成最少取多少石 ...
- A. Blackjack
A. Blackjack time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- char、varchar 哪种的搜索效率高
在MySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型.char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于 ...
- Docker 的安装与使用
账号:xcj26密码:X*c*j*5**6**邮箱:**j26@126.com 账号:xichji密码:X*c*j*5**6**邮箱:45*666***@qq.com 摘自:https://b ...
- GC详解
GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...
- Babel编辑ES6代码
1.安装babel依赖 npm install --save-dev @babel/core @babel/cli @babel/preset-env npm install --save @babe ...
- 20175212童皓桢 实验三敏捷开发与XP实践实验报告
20175212童皓桢 实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验步骤 一.Code菜单功能的研究 Move Line/statement Down/Up:将某 ...
- http服务配置和apache
CentOS 6 httpd 程序环境 记录了httpd的主进程编号: 主程序文件: /usr/sbin/httpd /usr/sbin/httpd.worker /usr/sbin/http ...
- leetcode 230二叉搜索树中第k小的元素
通过stack进行中序遍历迭代,timeO(k),spaceO(1) /** * Definition for a binary tree node. * struct TreeNode { * in ...