文档库 最新最全的文档下载
当前位置:文档库 › 浮点数和二进制数转换

浮点数和二进制数转换

浮点数和二进制数转换
浮点数和二进制数转换

浮点数转换成二进制数

2011-04-17 12:41:51| 分类:C language | 标签:浮点数二进制尾数十六进制ieee |字号大中小订阅

因为要参加软考了(当然也只有考试有这种魅力),我得了概浮点数转化为二进制表示这个最难的知识点(个人认为最难)。俺结合大量的从网上收集而来的资料现整理如下,希望对此知识点感兴趣的pfan有所帮助。

基础知识:

十进制转十六进制;

十六进制转二进制;

IEEE制定的浮点数表示规则;

了解:

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:

符号位阶码尾数长度

float 1 8 23 32

double 1 11 52 64

以下通过几个例子讲解浮点数如何转换为二进制数

例一:

已知:double类型38414.4。

求:其对应的二进制表示。

分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:

最高位63位是符号位,1表示该数为负,0表示该数为正;

62-52位,一共11位是指数位;

51-0位,一共52位是尾数位。

步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。

把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理:

0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……

实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。

如果你够耐心,手工算到53位那么因该是:

38414.4(10)=1001011000001110.0110011001100110011001100110011001100(2) 科学记数法为:1.001011000001110 0110011001100110011001100110011001100,右移了15位,所以指数为15。或者可以如下理解:

1.001011000001110 0110011001100110011001100110011001100×2^15

于是来看阶码,按IEEE标准一共11位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上1023(2^10-1),在这里,阶码:15+1023=1038。二进制表示为:100 00001110;

符号位:因为38414.4为正对应为0;

合在一起(注:尾数二进制最高位的1不要):

01000000 11100010 11000001 110 01100 11001100 11001100 11001100 11001100

IEEE浮点数的表示方法及规则

计算机组成原理课程作业报告 解决的问题: IEEE浮点数的表示方法及规则 班级: 10021101 学号: 2011302610 姓名:最天使 日期: 2013年10月29日

一、什么是IEEE754标准 1.两种基本浮点格式:单精度和双精度; 2.两种扩展浮点格式:单精度扩展和双精度扩展; 3.浮点数运算的准确度要求:加、减、乘、除、平方、余数,将浮点格式的数舍入为整数值; 4.在十进制字符串和两种基本浮点格式之一的二进制浮点数格式之间的转换的准确度、单一性和一致性要求; 5.五种异常:乘、除、平方根、余数、在不同浮点格; 6.四种舍入方向: ①向最接近的可表示的值:Round(0.5) = 0; Round(1.5) = 2; Round(2.5) = 2; ②当有两个最接近的可表示的值时首选“偶数”值; ③向负无穷大(向下):floor(1.324) = 1 floor(-1.324) = -2 ④向正无穷大(向上)以及向(截断):C/C++ 函数ceil() ceil(1.324) = 2 Ceil(-1.324) = -1; 二、IEEE754表示浮点数的格式参数: 类型存储位数偏移值 数符S (位)阶码E (位) 尾数M (位) 总位数 (位) 十六进制十进制 短实数 1 8 23 32 0X7FH +127 长实数 1 11 52 64 0X3FFH +1023 临时实数 1 15 64 80 0X3FFFH +16383 特殊情况: 对于阶码为0或者255时,IEEE有特殊的规定: 1.如果E是0并且M是0,这个数+0(和符号位相关); 2.如果E=2-1并且M是0,这个数是正负无穷大(和符号相关); 3.如果E=2-1并且M不是0,这个数表示为不是一个数(NaN)。

二进制小数

二进制小数 我们曾经学了二进制以及八,十六及各种进制的整数,以及它们的加减乘除四则运算.大家必然会提问:与十进制分数、小数类似的二进制分数、小数,如何推广过来? 一个二进制小数,不妨先讲纯小数:0<n<1, n=,每个bi或为0,或为1.. 二进制小数的运算也和十进制小数运算相类似,差别在于这里是逢二进一,退一还二.十进制小数化为二进制小数,主要通过分数作中间媒介. 例将10化为二进制小数.k表示k进位数). 这表示十进制有限小数可能化成二进制循环小数. 本节重点讲二进制循环小数如何化为二进制分数.回忆十进制循环小数化分数,一是要学习推理中的思想方法,二是最好归纳成一个易用易记的公式. 十进制循环小数化分数一般公式: 这些公式的推导过程如下,请体会思想方法. 齐,消去了让人害怕的无限长的小数): 至于混循环,只要借用已证得的公式①,因为 其实公式②中,当s=0时,就是公式①,复杂的公式②是借用简单情况下的公式①推来.推出后①包含在②之中. 对于二进制循环小数化二进制分数,也可同样推导. 至于二进制混循环小数:也记这小数的整体为S. 从推导和记忆规则看,公式和与十进制公式①和②相仿.那么读者一定会归纳出任意进制的循环小数化分数的公式. 解:用公式 例3 化2为二进制分数. 解:由公式 直接检验 现在再看推导公式的方法,关键是把循环小数的值设为S,好比列方程设未知数,而10kS-S恰好消去了烫手的无限长的小数部分,推出方 这样的思想,在研究等比数列时也用到了.以前讲过有限项数列:a1,a2,a3,,ai,,an.所谓等比数列,即它每一项都是前一项乘上一公共值q,也即: a1,a2=a1q,a3=a2q,,ai=ai-1q,,an=an-1q, 或 a1,a2=a1q,a3=a1q2,,ai=a1qi-1,,an=a1qn-1. 现在要求出a1+a2+a3++ai++an. 思想方法:第一步: 设S=a1+a2++an=a1+a1q+a1q2++a1qn-1. 上式两边乘上q,作为第二步: qS=a1q+a1q2++a1qn-1+a1qn. 当q<1时,用上式两边减下式两边,得到 S-qS=a1-a1qn, 公式称为公比小于1的等比级数前n项求和公式.它叙述为:前n项和等于首项与首项乘公比的n次幂的差除以1与公比之差. 例4

浮点数的二进制表示

浮点数的二进制表示 基础知识: 十进制转十六进制; 十六进制转二进制; 了解: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64 以下通过几个例子讲解浮点数如何转换为二进制数 例一: 已知:double类型38414.4。 求:其对应的二进制表示。 分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位: 最高位63位是符号位,1表示该数为负,0表示该数为正; 62-52位,一共11位是指数位; 51-0位,一共52位是尾数位。 步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。 把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。 如果你够耐心,手工算到53位那么因该是: 38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2) 科学记数法为:1.0010110000011100110101010101010101010101010101010101,右移了15位,所以指数为15。或者可以如下理解:

C语言的数据类型→浮点型数据

C语言的数据类型→浮点型数据 一、浮点型常量的表示方法: C语言中的浮点数(floating point unmber)就是平常所说的实数。 浮点数有两种表示形式: (1)、十进制小数形式。它由数字和小数点组成(注意必须有小数点)。 如:0.123 、 123.、123.0、0.0 都是十进制小数形式。 (2)、指数形式。 如:123e3或123E3都代表123*103。 注意字母e(或E)之前必须有数字,且e后面的指数必须为整数,如e3、 2.1e 3.5、 e3、 e 等都不是合法的指数形式。 一个浮点数可以有多种指数表示形式。例如123.456e0、 12.3456e1、1.23456e2 、 0.123456e3 、 0.0123456e4 、 0.00123456e5等。其中的1.23456e2称为“规范化的指数形式”。即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。例如2.3478e2 、 3.099E5 、 6.46832E12都属于规范化的指数形式,而

12.908e10 、0.4578E3 、 756e0则不属于规范化的指数形式。一个浮点数在用指数形式输出时,是规范化的指数形式输出的。例如。若指定将实数5689.65按指数形式输出。输出的形式是5.68965e+003,而不会是0.568965e+004或56.8965e+002。 二、浮点型变量 一个浮点型数据一般在内存中4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。例如:实数3.14159在内存中的存放形式可以用下图来表示: 1、浮点型变量在内存中的存放形式。 上图使用十进制数来表示的,实际上在计算机中是用二进制数来表示小数部分以及用2的幂次来表示指数部分的。

浮点数的表示和基本运算

浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M表示公式偏移量 1823(-1)S*2(P-127)*1.M127 11152(-1)S*2(P-1023)*1.M1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 S(第31位)P(30位到 23位) M(22位到 0位) 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1) 当P = 0, M = 0时,表示0。 (2) 当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

(3) 当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.Net Framework的时候,我们通常会用到下面三个常量 Console.WriteLine(float.MaxValue); // 3.402823E+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢? 根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。尾数的最大值是11111111111111111111111。 那么这个最大值就是:0 11111110 11111111111111111111111。 也就是 2(254-127) * (1.11111111111111111111111)2 = 2127 * (1+1-2-23) = 3.40282346638529E+38 从上面的双精度表示可以看出,两者是一致的。最小的数自然就是- 3.40282346638529E+38。 对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码P = -126,尾数 M = (0.00000000000000000000001)2 。此时该数的二进制表示为:0 00000000 00000000000000000000001 也就是2-126 * 2-23 = 2-149 = 1.40129846432482E-45。这个数字和上面的Epsilon 是一致的。 如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000 也就是:2-126 * (1+0) = 1.17549435082229E-38。 3 浮点数的精度问题 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

二进制、十进制、位数表示法

子网划分及子网掩码的二进制、十进制、位数表示法 子网划分及子网掩码的二进制、十进制、位数表示法 为了保证所配置的子网地址可以工作,在网络上每台计算机都必须配置自己主机地址中的哪一部分是被用来表示子网地址的。这可以通过在每台计算机上指定一个子网掩码的方式来完成。IPV4中的子网掩码是一个4字节32位比特的值,通过它,接收IP数据包的一方可以从IP地址的主机号部分中区分出子网号地址。TCP/IP中,使用二进制1和0的组合来创建一个32位比特的子网掩码,子网掩码中1的位置表示是网络或子网的地址部分,0表示节点(主机)地址部分。A类、B类、C类地址默认的子网掩码如下: (表一A、B、C三类IP地址及其默认子网掩码对应表) 下面我们来看一下关于子网掩码的划分,由于C类地址的子网划分最为常见,所以我们以C类地址为例,A类和B类的子网掩码划分方法与C类一致。 从表一中可以知道,C类地址只有最后一个字节的8位比特可以定义主机地址,且子网的位数从左往右进行定义,所以,C类子网掩码只能为以下的情况,分别对于二进制、十进制和位数法。 (表二C类地址子网掩码对应表) 注意: 1.在以太网中,全0的地址被定义为网络地址,全1的地址被定义为广播地址,这两种地址在子网划分时应 该不予考虑。

2.另外,早期的RFC规定,不允许使用一个比特进行子网划分,即不支持零子网的情况。但现在RFC的修订 版中已指出可以使用零子网的方法进行子网划分,且网络设备也逐渐开始支持零子网。 表二中的位数法(/25,/28等)是什么意思呢?实际上它的意思是表示有多少位比特被放入了当前的网络以及子网的地址部分中。当十进制子网掩码为255.255.255.128时,其对应的二进制表示形式为 11111111.11111111.11111111.10000000,从二进制的表示中可以看出,掩码中共有25位被置为1,以此来表示网络地址和子网的地址,所以用位数表示法时我们将其写为/25;当掩码为255.255.255.240时,二进制的值对应表示为11111111.11111111.11111111.11110000,其中有28位被置为1,所以用位数表示法表示为/28。 A类和B类地址子网掩码的计算方法同C类地址类似,所以通过上面的方法即可有效地计算出子网掩码的各种表示方法。

浮点数在内存中的表示方法

浮点数在内存中的表示方法 浮点数保存的字节格式如下: 地址+0 +1 +2 +3 内容SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 较高的有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。 浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:地址+0 +1 +2 +3 内容0xC1 0x48 0x00 0x00 浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转换。浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表 所列的那样分开,例如: 地址+0 +1 +2 +3 格式SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 二进制11000001 01001000 00000000 00000000 十六进制C1 48 00 00 从这个例子可以得到下面的信息: 符号位是1 表示一个负数 幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。尾数是后面的二进制数10010000000000000000000 在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数 点到尾数的开头,得到尾数值如下: 1.10010000000000000000000

接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动 小数点.因为 指数是3,尾数调整如下: 1100.10000000000000000000 结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示 (1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。 小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示 (1*2^(-1))+ (0*2^(-2))+(0*2^(-2))...=0.5。 这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值 0xC1480000表示-12.5。 所有的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEE E 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的规格: 符号位指数位小数部分 指数偏移量单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127 双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023 我们以单精度浮点数来说明: 指数是8位,可表达的范围是0到255 而对应的实际的指数是-127到+128 这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的 -127表示的数字是0 128和其他位数组合表示多种意义,最典型的就是NAN状态

浮点数表示方法的分析研究

浮点数表示方法的分析研究.txt13母爱是迷惘时苦口婆心的规劝;母爱是远行时一声殷切的叮咛;母爱是孤苦无助时慈祥的微笑。 浮点数表示方法的分析研究 [日期:2006-06-10] 来源:作者: [字体:大中小] 摘要:在《计算机组成原理》课程的教学中,浮点数的表示与运算是一个重点,也是难点。本文对浮点数的一般表示及标准表示的方法、范围、存储格式等进行了比较深入地比较、分析和研究,力求给读者一个清晰的概述。 关键词:浮点数,表示方法,符号,尾数,阶码,范围 《计算机组成原理》课程是计算机科学与技术专业的一门必修专业基础课,主要是讲述计算机系统几大硬件的组成结构和工作原理。在其核心部件——运算器(Arithmetician)的运算机制中,浮点数(Floating-point)的表示与运算方法是一个重点,也是难点,笔者在查阅了大量中外文文献的基础上,根据多年的教学实践经验,对浮点数的表示方法、规格化处理方法、表示范围进行了比较详细地分析研究,以方便学生的学习,共同行们参考。 1、浮点数的一般表示方法 在数学中,表示一个浮点数需要三要素:尾数(mantissa)、指数(exponent,又称阶码)和基数(base),都用其第一个字母来表示的话,那么任意一个浮点数N可以表示成下列形式:N=M×BE,例如N1=1.234×10-6, N2= -0.001011×2011等,同样的数字对于不同的基数是不相同的,移动小数点的位置,其指数相应地跟着变化。在计算机中,表示一个浮点数,同样需要以上三要素,只是阶码与尾数一同存储,基数常有2、8、16等数值,下面的讨论以2为基数进行。 将浮点数放在计算机中存储时,尾数M用定点(Fixed-point)小数的形式,阶码E用有符号整数形式,改变M中小数点的位置,同时需要修改E的值,可以给出有效数字(significant number)的位数,因此M和E决定了浮点数的精度(precision),E指明小数点在B进制数据中的位置,因而E和B决定了浮点数的表示范围(range),浮点数的符号(Sign)是单独考虑,设阶码有m+1位,尾数有n+1位,则一般浮点数的表示方法如图1所示,其中,下标s代表符号位,下标数字代表数字所处的位数,尾数的小数点默认最高数字位M1之前。图(b)是将尾数的符号位提在最前面,其它部分与图(a)一样,是目前常用的一种表示形式。 图1 浮点数的一般表示形式 在这种表示方法中,阶码的二进制编码(binary code)一般是原码(sign magnitude)、补码(twos complement)或移码(bias),尾数的编码一般是原码或补码。 2、浮点数的规格化处理 在浮点数系统中,小数点的浮动使数值的表示不能惟一,从而给数据处理带来困难,因此有必要使浮点数的表示与存储有一定的标准,考虑到阶码、尾数之间的关系,常将尾数的最高数字位是有效值的数值称为规格化(normalization),由于尾数可以是原码或补码,所以有两种规格化的形式,如表1所示。

IEEE浮点数表示法

IEEE浮点数表示法 ------------------------------------------------- float 共计32位(4字节) 由最高到最低位分别是第31、30、29、 0 31位是符号位,1表示该数为负,0反之 30~23位,一共8位是指数位(-128~127) 22~ 0位,一共23位是尾数位 每8位分为一组,分成4组,分别是A组、B组、C组、D组 每一组是一个字节,在内存中逆序存储,即: DCBA 31 30 23 22 0 |-|--------|-----------------------| | | || |-|--------|-----------------------| 注: 尾数的存储位为23位,由于没有存储最高位的1,所以实际有效位为24位。如果其中20位都用来表示小数部分,能表示的最大值为0.999999 我们先不考虑逆序存储的问题,因为那样会把读者彻底搞晕,所以我先按照顺序的来讲,最后再把他们翻过来就行了。

纯整数的表示方法 ------------------------------------------------- 现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数123456.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示: 1 11100010 01000000 也可以这样表示: 1 11100010 01000000.0 然后将小数点向左移,一直移到离最高位只有1位: 1.11100010 01000000 一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样 1 11100010 01000000 = 1.11100010 01000000 * (2^16) 现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧?(呵呵,可别拿你买的臭鸡蛋甩我),所以这个1我们还有必要保留他吗?(众:没有!)好的,我们删掉他。这样尾数的二进制就变成了: 11100010

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 1.浮点数表达方式 我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e 其中,S—尾数,代表N 的有效数字; R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。 比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。 2.浮点数的规格化 一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。 对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。 当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

浮点数1

浮点数在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。 一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。 这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。 例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。 此外,浮点数表示法通常还包括一些特别的数值:+∞和?∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。 大部份计算机采用二进制(b=2)的表示方法。位(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度和双精度。有一些计算机提供更大的浮点数,例如英特尔公司的浮点运算单元Intel8087协处理器(以及其被集成进x86处理器中的后代产品)提供80位长的浮点数,用于存储浮点运算的中间结果。还有一些系统提供128位的浮点数 浮点数的表示 在实际应用中,往往会使用实数,例如下面的一些十进制实数: 179.2356=0.1792356x10^3 0.000000001=0.1x10^8 3155760000=0.215576x10^6 很明显,上述第一个数既有整数也有小数,不能用定点数格式化直接表示,后两个数则可能超出了定点数的表示范围,所以计算机引入了类似与科学表示法来标示实数。 (1)典型的浮点数格式 在机器中,典型的浮点数格式如图所示 浮点数代码由两部分组成:阶码E和尾数M。浮点数真值为: N=+/-(R^E)xM R是阶码的底。在机器中一般规定R为2,4,8或16,与尾数的基数相同。例如尾数为二进制,则R也为2。同一种机器的R值是固定不变的,所以不需要在浮点数代码中表示出来,他是隐含约定的。因此,机器中的浮点数只需表示出阶码和尾数部分。 E是阶码,即指数值,为带符号整数,常用移码或补码表示。 M是尾数,通常是纯小数,常用原码或补码表示。

浮点数的二进制表示学习笔记

文章1: 单双精度浮点数的IEEE标准格式 目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53位尾数和1 51 0 细心的人会发现,单双精度各部分所占字节数量比实际存储格式都了一位,的确是这样,事实是,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位。 阶以移码的形式存储。对于单精度浮点数,偏移量为 127(7FH),而双精度的偏移量为1023(3FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+3即130(82H),双精度为 1026(402H)。 浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全

1,尾数部分全零。符号位指示正无穷或者负无穷。 motorola 的cpu按big endian顺序排列。 浮点数的二进制表示学习笔记 基础知识: 十进制转十六进制; 十六进制转二进制; IEEE制定的浮点数表示规则; 了解: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行 float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64 以下通过几个例子讲解浮点数如何转换为二进制数

二进制小数

第九讲二进制小数 我们曾经学了二进制以及八,十六及各种进制的整数,以及它们的加减乘除四则运算?大家必然会提问:与十进制分数、小数类似的二进制分数、小数,如何推广过来? 一个二进制分数,就是a是二进制整数,也是二进制整数. b 一个二进制小数,不妨先讲纯小数:O v n v 1, n = O.b i b2b3, b i,,每个b i或为0,或为1.(b i不全为0,也不全为1). 切所在的位称为£分位; b2:》分包 W *分位.(类似于十进制小数0引屯屯…,引为君分位, 匚为壽分位,…)? 二进制小数的运算也和十进制小数运算相类似,差别在于这里是逢二进 十进制小数化为二进制小数,主要通过分数作中间媒介. 例将(0.3)10化为二进制小数.(用(a)k表示k进位数) =(0,010*********L--)a -(o.oiooi)2

0.01001 1010)1100 wcw ~ 醴成循环) 这表示十进制有限小数可能化成二进制循环小数. 本节重点讲二进制循环小数如何化为二进制分数.回忆十进制循环小数化分数,一是要学习推理中的思想方法,二是最好归纳成一个易用易记的公式. 十进制循环小数化分数一般公式: ①纯循环小数;(0釦幻…耳)10匸逗冋…% ②混循坏小数’ (0衍知…葢診】心…気〕 这些公式的推导过程如下,请体会思想方法. 设S二(坤…瓦)心第一歩*在此等式的两边乘1兀右边相当于小数点右移k位,得bs二為W 釘两…和第二歩:两个等式左右两边分别相减,左边为讥7右边为爲三〔巧妙在于差值很整 齐,消去了让人“害怕”的无限长(虽然是循环)的小数): 3(1声.1)=佔…色=沪警二譽.&式①证得. I _ _ ■ k亍 至于混循环,只要借用已证得的公式①,因为 (0.盟弹2…盟診1孔…氐)10 空價?…孔:釘*二鉅) ~w(分子小数点右移龜) 99--900--0 kT介

浮点数表示法-C语言

浮点数表示法 任何数据在内存中都是以二进制(1或着0)顺序存储的,每一个1或着0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1156,那么它的二进制表达就是:00000100 10000100。 由于Intel CPU的架构是Little Endian(请参照计算机原理相关知识),所以它是按字节倒序存储的,那么就应该是这样:10000100 00000100,这就是定点数1156在内存中的结构。 对于一个数0x1122 使用Little Endian方式时,低字节存储0x22,高字节存储0x11 而使用Big Endian方式时, 低字节存储0x11, 高字节存储0x22 浮点数是如何存储的呢?目前已知的所有的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。 下面来看一下具体的float的规格: float:32位,4字节 由最高到最低位分别是第31、30、29、 0 31位是符号位,1表示该数为负,0反之。 30-23位,一共8位是指数位。 22-0位,一共23位是尾数位。 每8位分为一组,分成4组,分别是A组、B组、C组、D组。 每一组是一个字节,在内存中逆序存储,即:DCBA 我们先不考虑逆序存储的问题,所以先按照顺序的来讲,最后再把他们翻过来就行了。 现在让我们按照IEEE浮点数表示法,一步步将float型浮点数123456.0f转换为十六进制代码。 在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示: 1 11100010 01000000也可以这样表示:11110001001000000.0然后将小数点向左移,一 直移到离最高位只有1位,就是最高位的1:1.11100010010000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样:1.11100010010000000 * ( 2 ^ 16 )好了,现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,不能把16说成是0016。 所以这个1也保留,删掉。这样尾数的二进制就变成了:11100010010000000最后在尾数的后面补0,一直到补够23位:11100010010000000000000

规格化浮点数

规格化浮点数 第一章第四节浮点数的表示方法 一、浮点数表示 一个数的浮点形式(设基数是2)可写成: N = (+ -)M 2E 其中:M代表尾数,E代表阶码。 计算机中浮点数只用尾数和阶码表示,其形式如下: 为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。采用二进制表示时,若尾数大于零,则规格化数应该是01XXXX的形式;若尾数小于零,则规格化数应为10XXXX 的形式。 二、实例 【例1】设X=0.0110×23 ,用补码、浮点数形式表示阶码为Xj=011,尾数为00110,这时由于X尾数不符合01XXXX的形式,因此不是规格化数,必须先进行规格化处理。 方法:若尾数小于1/2,把尾数左移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码减1即可,否则继续左移和调整阶码;若尾数大于1,则把尾数右移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码加1即可,否则继续右移和调整阶码。 上例中,00110左移一位为01100,符合规则化标准,此时阶码减1,为010即得到浮点表示形式。 一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的 在浮点表示方法中,小数点的位置是浮动的,阶码可取不同的数值。为了便于计算机中小数点的表示,规定将浮点数写成规格化的形式,即尾数的绝对值大于等

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

十进制小数0.2为什么无法以二进制表示

二进制转十进制,十进制转二进制的算法  位(bit) 一位二进制数,又称比特  字节(byte) 1B = 8b 内存存储的最小单元  字长:同一时间内,计算机能处理的二进制位数  字长决定了计算机的运算精度,字长越长,计算机的运算精度就越高。因此,高性能的计算机,其字长较长,而性能较差的计算机,其字长相对要短一些。  其次,字长决定了指令直接寻址的能力。一般机器的字长都是字节的1、2、4、8倍。微机的字长为8位、16位、32位、64位,如286机为16位机,386和486是32位机,最新推出的PIII为64位高档机。  字长也影响机器的运算速度,字长越长,运算速度越快。  字:是计算机中处理数据或信息的基本单位。一个字由若干字节组成,通常将组成一个字的位数叫做该字的字长。  进制  一位八进制数字可以用三位二进数来表示,一位十六进制数可以用四位二进数来表示,所以二进制和八进制、十六进制间的转换非常简单  如:将(1010111.01101)2转换成八进制数  1010111.01101=001 010 111. 011 010  ↓ ↓ ↓ ↓ ↓  1 2 7 3 2  所以(1010111.011.1)2=(127.32)8

将(327.5)8转换为二进制  3 2 7. 5  ↓ ↓ ↓ ↓  011 010 111. 101  所以(327.5)8=(11010111.101)2  将(110111101.011101)2转换为十六进制数  (110111101.011101)2=0001 1011 1101. 0111 0100 ↓ ↓ ↓ ↓ ↓  1 B D 7 4  所以(110111101.011101)2=(1BD.74)16  将(27.FC)16转换成二进制数  2 7. F C  ↓ ↓ ↓ ↓

进制之间转换(含小数部分)

二、八、十、十六之间的转换 1、十进制与二进制之间的转换 (1)十进制转换为二进制,分为整数部分和小数部分 ①整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例: 例:将十进制的168转换为二进制 得出结果将十进制的168转换为二进制,(10101000)2 分析:第一步,将168除以2,商84,余数为0。 第二步,将商84除以2,商42余数为0。 第三步,将商42除以2,商21余数为0。 第四步,将商21除以2,商10余数为1。 第五步,将商10除以2,商5余数为0。 第六步,将商5除以2,商2余数为1。 第七步,将商2除以2,商1余数为0。 第八步,将商1除以2,商0余数为1。 第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000

(2)小数部分 方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分 为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例: 例1:将0.125换算为二进制 得出结果:将0.125换算为二进制(0.001)2 分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25; 第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5; 第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0; 第四步,读数,从第一位读起,读到最后一位,即为0.001。 例2,将0.45转换为二进制(保留到小数点第四位)

浮点数的二进制表示

浮点数的二进制表示学习笔记 C++ 2008-12-20 13:31:17 阅读2931 评论10 字号:大中小 因为要参加软考了(当然也只有考试有这种魅力),我得了概浮点数转化为二进制表示这个最难的知识点(个人认为最难)。俺结合大量的从网上收集而来的资料现整理如下,希望对此知识点感兴趣的pfan有所帮助。 基础知识: 十进制转十六进制; 十六进制转二进制; IEEE制定的浮点数表示规则; 了解: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64 以下通过几个例子讲解浮点数如何转换为二进制数 例一: 已知:double类型38414.4。 求:其对应的二进制表示。 分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位: 最高位63位是符号位,1表示该数为负,0表示该数为正; 62-52位,一共11位是指数位; 51-0位,一共52位是尾数位。 步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。 把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。 如果你够耐心,手工算到53位那么因该是: 38414.4(10)=1001011000001110.0110011001100110011001100110011001100(2) 科学记数法为:1.001011000001110 0110011001100110011001100110011001100,右移了15位,所以指数为15。或者可以如下理解: 1.001011000001110 0110011001100110011001100110011001100×2^15 于是来看阶码,按IEEE标准一共11位,可以表示范围是-1024 ~ 1023。

相关文档