2.浮点数的存储原理

合集下载

C语言练习题

C语言练习题

练习一1、把十进制数56,-74转化为对应的二进制数,并分别写出它们的8位原码和补码。

2、什么是浮点数?计算机内部是如何存储浮点数的?3、什么是ASCII码?ASCII码编码方案有何特点?试述常用字符的大致编码顺序。

4、什么是汉字的机内码?在计算机的内存中如何区分机内码与ASCII码?5、试述计算机内部采用二进制工作的原因,以及计算机的工作原理。

6、试述程序设计的概念,以及程序设计的基本过程。

7、什么是算法?算法有哪些特性和描述方法?算法与程序的关系如何?8、什么是高级语言?有哪些主要的高级语言?9、什么是标识符和关键字?它们分别有什么作用?10、标识符是如何构成的?使用标识符时应注意哪些问题?11、下列字符序列中,哪些可以构成合法的标识符?signed a-1 x_y_1 $use π0x56 sum num# _1234 age12、试述C程序的基本结构。

13、试述C程序上机的全过程,并解释这过程中产生的各类错误的含义。

练习二1、C语言的基本数据类型有哪些?数据类型对数据的表示和运算有什么约束?2、什么是常量?数值常量和符号常量有何区别?使用符号常量有什么好处?3、什么是变量?变量的名字、地址、值、类型有什么关系?4、如何定义变量?C语言中为什么规定变量必须先定义,后使用?5、常量也有数据类型,请问如何区分整型常量和实型常量的数据类型?6、字符常量与字符串常量的表示形式有何区别?'a'和"a"有什么不同?7、字符串常量"\\\34ab\n"中有多少个字符?8、下列表达式计算时,哪些地方会发生类型转换?从什么类型转换到什么类型?表达式计算的结果是什么类型?值多少?(1) 2.5+2*7%2/4 (2) 4*(2L+6.5)-12(3) 10/(5*3) (4) 2*10.0/(5*3)9、设有变量定义:float x=2.7,y=4.5; int a=8; 求表达式y+a%5*(int)(x+y)/2%4 的值。

C++标准教程03-2.基本数据类型

C++标准教程03-2.基本数据类型

北京源智天下科技有限公司
1-8
联系方式:
浮点类型——浮点数的分类和定义 浮点数的分类和定义 浮点类型
浮点数变量的定义格式与整型变量相同,不同之处在于浮点数的关键字不 同。浮点数变量有3类,分别是单精度浮点数类型、双精度浮点数类型和长双 精度浮点数类型。 (1)单精度浮点数类型:关键字是float,占用4个字节(32位)的内存单 元,由float定义的变量取值范围在10-37~1038之间。float类型变量的定义格式 参考以下代码。 float fNum = 3.1415; (2)双精度浮点数类型:关键字是double,占用8个字节(64位)的内 存单元,由double定义的变量取值范围在10-307~10308之间。double类型变量 的定义格式参考以下代码。 double x = 123.46679; double y = 564879.3589445; (3)长双精度浮点数类型:关键字是long double,占用8个字节(64位) 的内存单元,由long double定义的变量取值范围在10-307 ~10308 之间。long double类型变量的定义格式可以参考以下代码。 long double x = 123.46679; long double y = 564879.3589445;
对于-14,根据计算机对于有符号数的规定,存放数据的内存单元的最高 位充当符号位,而其他位用于存放数据。因此,-14可以按照下面的方式存放。
但是实际上这样的存放方式是错误的,因为将上面2个二进制数相加并不 为零。因此对于这种情况,为了解决负数存放以及负数的算术运算问题,整数 的数值在内存中是以补码的方式表示。补码是根据原码而来的,所谓原码就是 一个整数的绝对值的二进制表示,比如(0000000000001110)2就是14和-14的 原码。

二进制浮点数规范化

二进制浮点数规范化

竭诚为您提供优质文档/双击可除二进制浮点数规范化篇一:浮点数的二进制表示浮点数的二进制表示1.前几天,我在读一本c语言教材,有一道例题:#includevoidmain(void){intnum=9;/*num是整型变量,设为9*/float*pFloat=/*pFloat表示num的内存地址,但是设为浮点数*/printf("num的值为:%d\n",num);/*显示num的整型值*/printf("*pFloat的值为:%f\n",*pFloat);/*显示num 的浮点值*/*pFloat=9.0;/*将num的值改为浮点数*/printf("num的值为:%d\n",num);/*显示num的整型值*/printf("*pFloat的值为:%f\n",*pFloat);/*显示num 的浮点值*/}运行结果如下:num的值为:9*pFloat的值为:0.000000num的值为:1091567616*pFloat的值为:9.000000我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。

我读了一些资料,下面就是我的笔记。

2.在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。

intnum=9;上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。

普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000000000000000000000001001,写成16进制就是0x00000009。

那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?3.根据国际标准ieee754,任意一个二进制浮点数V可以表示成下面的形式:V=(-1)^s×m×2^e(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

字节、字、双字,整数,双整数和浮点数详解

字节、字、双字,整数,双整数和浮点数详解

字节、字、双字,整数,双整数和浮点数详解1.引言1.1 概述在计算机科学和编程领域,字节、字、双字、整数、双整数和浮点数是非常重要的概念和数据类型。

它们在存储和处理数据时起着关键作用。

本文将对这些概念和数据类型进行详细解释和讨论。

首先,字节是计算机存储和处理数据的基本单位之一。

一个字节由8位二进制数字组成,可以表示256种不同的值。

字节一般用于存储和表示字符,例如ASCII码中的每个字符都用一个字节表示。

接下来,字是字节的扩展,通常由两个字节组成。

字是更大的数据单元,可以表示更多的不同值。

字通常用于存储和表示较大的字符集,如Unicode编码中的字符。

双字是对字的一种拓展,由四个字节组成。

双字可以表示更大范围的数据,通常用于存储和处理较大的整数和浮点数。

然后,整数是一种完整的数值数据类型,用于表示不带小数部分的数值。

整数可以是负数、零或正数,其取值范围取决于所使用的字节数。

整数常用于计算、逻辑运算和数据存储。

双整数是对整数的一种拓展,由两个整数组成。

双整数可以表示更大范围的整数值,通常用于需要更精确的计算和表示的情况。

最后,浮点数是一种带有小数部分的数值数据类型。

浮点数通常由双字表示,其中一部分用于存储小数部分,另一部分用于存储指数部分。

浮点数常用于科学计算、图形处理和物理模拟等领域。

本文将详细探讨字节、字、双字、整数、双整数和浮点数的定义、特点、应用、表示方式、运算规则和数据范围等方面内容。

通过深入理解这些概念和数据类型,我们可以更好地理解计算机的内部处理和存储方式,并在编程中更加灵活和高效地处理数据。

1.2文章结构文章结构部分的内容可以写成以下方式:1.2 文章结构本文将详细介绍字节、字、双字、整数、双整数和浮点数的概念以及其应用。

文章结构如下:2.正文2.1 字节2.1.1 定义本节将介绍字节的定义,以及字节在计算机中的作用和意义。

2.1.2 应用本节将探讨字节在不同应用场景下的具体应用,例如在存储和传输数据中的作用。

国开(中央电大)《计算机组成原理》网上形考任务试题及答案

国开(中央电大)《计算机组成原理》网上形考任务试题及答案

国开(中央电大)《计算机组成原理》网上形考任务试题及答案国开(中央电大)《计算机组成原理》网上形考任务试题及答案形考任务一一、单项选择题(每题6分,共36分) 1.以下数中最小的数是。

(B) A.(1010011)2 B.(42)8 C.(10011000)BCD D.(5A)16 2.某计算机字长16位,采用补码定点小数表示,符号位为1位,数值位为15位,那么可表示的最大正小数为,最小负小数为。

(C) A. B. C. D. 3.两个补码数相加,在符号位相同时有可能产生溢出,符号位不同时。

(D) A.会产生溢出 B.也有可能产生溢出C.不一定会产生溢出 D.一定不会产生溢出 4.[X]原=010100,[X]反=。

(A) A.010100 B.001011 C.101011 D.101100 5.[X]原=110100,[X]补=。

(D) A.110100 B.001011 C.101011 D.101100 6.[X]原=110100,[X]移=。

(B) A.101100 B.001100 C.101011 D.011011 二、多项选择题(每题9分,共36分)1.机器数中,零的表示形式不唯一的是。

(ACD) A.原码 B.补码 C.移码 D.反码 2.ASCII编码。

(BC) A.是8位的编码 B.是7位的编码 C.共有128个字符 D.共有256个字符 E.有64个控制字符 3.相对补码而言,移码。

(BD) A.仅用于表示小数 B.仅用于浮点数的阶码局部 C.仅用于浮点数的尾数局部 D.1表示正号,0表示负号 4.当码距d=4时,海明校验码具有。

(ABDF) A.检错能力 B.纠错能力 C.只能发现1位错,但不能纠错 D.能发现1位错,并纠正1位错 E.能发现2位错,并纠正1位错 F.能发现2位错,并纠正2位错三、判断题 1.定点数的表示范围有限,如果运算结果超出表示范围,称为溢出。

对 2.浮点数数的表示范围取决于尾数的位数,精度取决于阶码的位数。

计算机组成原理浮点数运算

计算机组成原理浮点数运算

计算机组成原理浮点数运算
在计算机组成原理中,浮点数的运算涉及到数值的表示、加减运算等多个方面。

以下是浮点数运算的基本过程:
1. 对阶:在进行浮点数运算时,需要先对参与运算的浮点数的阶码进行对齐,即比较两个阶码的大小,将阶码较小的数向右移动,使得两个数的阶码相等。

2. 尾数运算:对阶完成后,进行尾数的加减运算。

尾数通常使用补码表示,加减运算规则与定点数的补码加减运算规则相同。

3. 结果格式化:根据尾数运算结果的符号和数值大小,确定最终结果的格式。

如果尾数的结果为正,则结果的格式与源码相同;如果尾数的结果为负,则结果的格式与补码相同。

浮点数的范围和精度由阶码和尾数的位数决定。

阶码的位数能够决定数的范围,尾数的位数决定数的有效精度。

在实际应用中,需要根据具体需求选择合适的浮点数表示方式和运算方法。

计算机组成原理(第三版)习题答案

计算机组成原理(第三版)习题答案

计算机组成‎原理习题答‎案第一章1.1计算机是一‎种能自动地‎、高速地对各‎种数字化信‎息进行运算‎处理的电子‎设备。

1.2冯诺依曼计‎算机体系结‎构的基本思‎想是存储程‎序,也就是将用‎指令序列描‎述的解题程‎序与原始数‎据一起存储‎到计算机中‎。

计算机只要‎一启动,就能自动地‎取出一条条‎指令并执行‎之,直至程序执‎行完毕,得到计算结‎果为止。

按此思想设‎计的计算机‎硬件系统包‎含:运算器、控制器、存储器、输入设备和‎输出设备。

各部分的作‎用见教材:P10—P121.3计算机的发‎展经历了四‎代。

第一代:见教材P1‎第二代:见教材P2‎第三代:见教材P2‎第四代:见教材P2‎1.4系统软件‎定义见教材‎:P12—13,应用软件定‎义见教材:P121.5见教材:P14—151.6见教材:P111.7见教材:P6—81.8硬件定义‎见教材:P9软件定义见‎教材:P12固件定义见‎教材:P131.91)听觉、文字、图像、音频、视频2)图像、声音、压缩、解压、DSP1.10处理程‎度按从易到‎难是:文本à图形‎→图像→音☒频→视频第二章2.1各数的原‎码、反码、补码和移码‎见下表:2.227/64=00011‎011/01000‎000=0.01101‎10=0.11011‎×2-1=101,01101‎1000规格化浮点‎表示为:[27/64]原[27/64]反=110,01101‎1000[27/64]补=111,01101‎1000同理:--27/64=--0.11011‎×2-1规格化浮点‎表示为:[27/64]=101,11101‎1000原[27/64]反=110,10010‎0111[27/64]补=111,10010‎10002.3 模为:29=10000‎00000‎2.4 不对,8421码‎是十进制的‎编码2.5浮点数的‎正负看尾数‎的符号位是‎1还是0浮点数能表‎示的数值范‎围取决于阶‎码的大小。

2.大学计算机基础教程全部_习题参考答案

2.大学计算机基础教程全部_习题参考答案

大学计算机基础教程习题参考答案习题11.1 选择题1. 美国宾夕法尼亚大学1946年研制成功的一台大型通用数字电子计算机,名称是( C)。

A) Pentium B) IBM PC C) ENIAC D) Apple2.1981年IBM公司推出了第一台(B)位个人计算机IBM PC5150。

A) 8 B) 16 C) 32 D) 643. 中国大陆1985年自行研制成功了第一台PC 兼容机,即(C)0520微机。

A) 联想B) 方正C) 长城D)银河√4. 摩尔定律主要内容是指,微型片上集成的晶体管数目每(C)个月翻一番。

A) 6 B) 12 C) 18 D) 24√5. 第四代计算机采用大规模和超大规模( C)作为主要电子元件。

A) 电子管B) 晶体管C)集成电路D)微处理器√6. 计算机中最重要的核心部件是( B)。

A) DRAM B) CPU C) CRT D) ROM√7. 将微机或某个微机核心部件安装在某个专用设备之内,这样的系统称为(C)。

A) 大型计算机B) 服务器C) 嵌入式系统D)网络√8. 冯.诺依曼计算机包括,(B)、控制器、存储器、输入设备和输出设备五大部分组成。

A) 显示器B)运算器C)处理器D)扫描仪√9.从市场产品来看,计算机大致可以分为大型计算机、(C)和嵌入式系统三类A) 工业PC B) 服务器C) 微机D) 笔记本微机√10.大型集群计算机技术是利用许多台单独的(B)组成的一个计算机系统,该系统能够像一台机器那样工作。

A) CPU B) 计算机C) ROM D)CRT1.2 填空题1. 计算机的发展经历了(电子管)、(晶体管)、(集成电路)和(大规模集成电路)四代变迁。

2.未来的计算机可能朝着(量子计算机)、(光子计算机)、(生物计算机)等方向发展。

3. 计算机系统是由(硬件系统)、(软件系统)两部分组成的。

4. 从目前市场上产品来看,微机包括(个人计算机)、(苹果系列微机)、(一体微机)、(笔记本微机)、(平板微机)、(掌上微机)和PC 服务器等几种。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

问题:long和float类型都是四个字节,为什么存储数值的范围相差极大?
原因:因为两者的存储原理时不同的。

浮点数的存储原理
作者: jillzhang
联系方式:jillzhang@
本文为原创,转载请保留出处以及作者,谢谢
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。

无论是单精度还是双精度在存储中都分为三个部分:
1.符号位(Sign) : 0代表正,1代表为负
2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
3.尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为:
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如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在内存中真正的存储方式。

首先看下8.25,用二进制的科学计数法表示为:1.0001*
按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示:
而单精度浮点数120.5的存储方式如下图所示:
那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据:0100001011101101000000000000,首先我们现将该数据分段,0 10000 0101 110 1101 0000 0000 0000 0000,在内存中的存储就为下图所示:
根据我们的计算方式,可以计算出,这样一组数据表示为:1.1101101*=120.5
而双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数。

所以这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的
下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果
float f = 2.2f;
double d = (double)f;
Console.WriteLine(d.ToString("0.0000000000000"));
f = 2.25f;
d = (double)f;
Console.WriteLine(d.ToString("0.0000000000000"));
可能输出的结果让大家疑惑不解,单精度的2.2转换为双精度后,精确到小数点后13位后变为了
2.2000000476837,而单精度的2.25转换为双精度后,变为了2.2500000000000,为何2.2在转换后的数值更改了而2.25却没有更改呢?很奇怪吧?其实通过上面关于两种存储结果的介绍,我们已经大概能找到答案。

首先我们看看2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的,而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数的方法为将小数*2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.8*2=1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011... ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储为:
但是这样存储方式,换算成十进制的值,却不会是2.2的,应为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果。

本文属作者原创,只发布在博客园,希望大家在转载的时候,注明出处和作者,谢谢。

相关文档
最新文档