对于c语言int类型和float,以及double类型表示范围的计算
首先说一下我原来错误的认识
int是32个bit,
如果我们把第一位理解为符号位,那么很显然int的范围是-(2^31-1)~2^31-1
但是实际上我们都知道int的最小值是-2^31次。。
为什么会这样呢。。首先对于这个问题困惑的话说明你的逻辑不够强
因为如果第一位是符号位那么上面的分析必然是正确的。。而且按照上面的表示方法,我们显然可以发现
有两个零,一个是+0,一个是-0
然而实际上好像并没有这么一说
所以说。。从这里。。正常的逻辑思维应该得出一个结论。。那就是c语言的int表示方法并不是我们想的那样
那么我们用x表示一个值。。+,-符号来表示正负号,等号右侧用来表示这个数在计算机里存储的值。。我们都知道计算机是没法存储正负号的(硬件)(额似乎不太恰当)
那么根据int的表示方法的hash他是怎么工作的呢
+x=x
-x=~(x)+1
除了要注意按位取反表达式。。我们还要注意需要把规定位数的两个数每一位对齐。。高位和过低都截断(?)
那么这样我们就可以发现。。-(2^31)=~(2^31)+1
这个太长啦。。我们举一个短一点的例子来算一下
-(2^3)=~(2^3)+1=2^3
-1000=0111+1=1000
哇哦好神奇。。这个就是4位数能表示的最小负数。。4位可以表示的最小负数可以用2^3来表示
那么同理。。32位整数能表示的最小负数就可以用2^31来表示。。显然可以存下的啊
所以说经过计算我们就发现了。。int的范围是-(2^31)~(2^31-1)
===========================================================================
研究完了int我们再来研究一下浮点数
那么我们来研究一下float的表示方法
此时我们是按照IEEE754标准来定义存在计算机里面浮点数的数据结构
那么对于float来讲。。它是一个32位浮点数
我们按照最低位是第0位来讲
首先这个32bit的位串要分成三部分。。符号位。。阶码。。尾数
我解释一下啥叫符号位。。第31位是符号位,0:+,1:-
啥是阶码呢。。。阶码是用来表示这个
1.xxx*2^x的x的大小的。。
首先这个标准规定了都用这种方式来表示浮点数
1.0是最小的。。1+1-2^(-23)是最大的基数。。(前面那个我都管它叫基数)
我用10进制的小数举个例子。。比如说。。3位小数的最大值是多少呢。。
显然我们知道是0.999那么其实它等于1-10^(0-3)
那么同理我们可以知道23位尾数的的小数的二进制最大小数可以表示成1-(2^(0-23))
然后我们就知道了。。那我这个x要有正有负才可以就是说。。小数点两个方向都可以浮动
但是他的这个存的策略是。。我只存正数。。等到我要取出来计算并且表示的时候
我用一个偏移量把它拆成两半。。一半大于零。。一半小于零
那么实际上对于float的这个尾数的存储策略的话。。是没有用到状态压缩的。。
它的尾数是多少我们就存多少。。如实复制即可
=================
那么对于浮点数这个东西我们还要注意
你怎么表示零。。
出现了1/非常小但不为零的小数=》无穷 你怎么处理
首先对于零的问题。。你尾数域默认最高有效位是1...所以没有存它。。
但是既然最高有效位不为0.。你怎么表示真正的0呢
所以这时候他们的策略是牺牲状态空间来特判表示0
那么对于无穷的情况呢?同理。。特判
当阶码全为零,尾数也全为零表示的真值是真正的0,并不是用很小的数逼近
当阶码全为1,尾数全为零表示的是无穷
根据符号位有,+0,-0,正无穷和负无穷
对于阶码全为1,尾数不为零的情况。。我们表示的是一个NaN非数,表示运算无效
====================
知道了上面这些我们就可以来计算float类型的值的范围了。。
由于这里的表示方法正数和负数只差一个符号
所以我们只考虑它的绝对值的范围就好了
即1.xxxx*2^x
那么我们知道阶码不存负数。。
所以上面那个x并不等于阶码的大小。。而是等于阶码E-127
为什么呢。。
我们知道E用8个bit存。。那么最大表示11111111=2^8-1
也就是255,那么我们知道这个数被用来特判无穷大和NaN
最小是0,用来特判0
所以对于除此之外的数。。
我们可以用1~254。。
但是你要有正有负啊。。分成两半。。
都减去127就变成了-126~127
这样就变成了x的范围
知道了1.xxx的范围和2^x的范围。。计算就很轻松了。。
绝对值
最大是(1+1-(2^(-23)))*2^127
最小是1.0*2^(-126)?
那么再具体的话。。加上正负号就行了。。
对于c语言int类型和float,以及double类型表示范围的计算的更多相关文章
- 不要在精确计算中使用float和double类型
http://blog.csdn.net/androiddevelop/article/details/8478879 一 问题描述 float和double类型不能用于精确计算,其主要目的是为了科 ...
- MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...
- Java中int类型和tyte[]之间转换及byte[]合并
JAVA基于位移的 int类型和tyte[]之间转换 [java] view plaincopy /** * 基于位移的int转化成byte[] * @param int number * @retu ...
- MySQL中Decimal类型和Float Double等区别
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...
- oracle数据库date类型和mysql数据库datetime类型匹配
oracle数据库有date类型,但是没有datetime类型 mysql数据库既有date类型也有datetime类型. Oracle数据库的date类型和mysql的date类型是不一样的,Ora ...
- Effective Java 第三版——60. 需要精确的结果时避免使用float和double类型
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 浮点型 float和double类型的内存结构和精度问题
首先引用一个例子在java中可能你会遇到这样的问题: 例:0.99999999f==1f //true 0.9999999f==1f //false 这是超出精度造成的,为了知道为什么会造成这样的问题 ...
- Sql的decimal、float、double类型的区别
三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E ...
- float和double类型的存储方式
Float double 类型在计算机的存储方式 计算机中只认识10的二进制数,那么该如何存储小数呢? 那么我们先看Floa类型: Float在计算机(32位)中是4个字节的,具体地:第一位为符号位0 ...
随机推荐
- VS2010工程文件减肥
由于VS2010中新增加了sdf和ipch文件等浏览数据库来支持智能浏览感知编辑.显示类视图等,使得随便一个小工程就上百兆,很占用空间也不方便工程项目的打包备份.为了不使用数据库以减小VS2010中的 ...
- 初识 MySQL 5.6 新功能、参数
摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...
- ffmpeg-20160525-git-bin
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- web.config中配置页面出错后跳转指定错误页面
每当用户访问错误页面时,会出现不友好的404错误,所以为了防止这种不友好,我们在web.config中的<system.web>节点下配置 <customErrors>,在出现 ...
- codeforces 490C. Hacking Cypher 解题报告
题目链接:http://codeforces.com/problemset/problem/490/C 题目意思:给出一个可能有10^6 位长的字符串且没有前导0的整数,问能否一分为二,使得前面的一部 ...
- Linux下WebSphereV8.5.5.0 安装详细过程
自WAS8以后安装包不再区别OS,一份介质可以安装到多个平台.只针对Installation Manager 进行了操作系统的区分 ,Websphere产品介质必须通过专门的工具Install Man ...
- 【leetcode】Remove Nth Node From End of List(easy)
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 【Git】笔记5 分支管理2
来源:廖雪峰 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一 ...
- NEFU 1112 粉刷栅栏算法
题目链接 中文题 简单搜索题 例数据 输入 6 1 1 1 1 9 9 输出 3 注意是每一个递归搜索都返回一个min 而不是只有总的返回min #include <cstdio> #in ...
- mongodb 3.2 用户权限管理配置
使用mongodb 有段时间了,由于是在内网使用,便没有设置权限,一直是裸奔. 最近有时间,研究了下mongodb 3.2 的用户权限配置,网上有许多用户权限配置的文章,不过大多是之前版本,有些出入, ...