尹世雅:什么是精度?

发布时间:2020-11-21   来源:未知    
字号:

  实型变量分为:单精度型和双精度型,

  其类型说明符为float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

  实型变量说明的格式和书写规则与整型相同。

  例如: float x,y; (x,y为单精度实型量)

  double a,b,c; (a,b,c为双精度实型量)

  实型常数不分单、双精度,都按双精度double型处理。

  void main(){

  float a;

  double b;

  a=33333.33333;

  b=33333.33333333333333;

  printf("%f\n%f\n",a,b);

  }

  此程序说明float、double的不同

  a ■■■■

  b ■■■■■■■■

  a<---33333.33333

  b<---33333.33333333333;;

  显示程序结果

  此程序说明float、double的不同

  float a;

  double b;

  a=33333.33333;

  b=33333.33333333333333; 从本例可以看出,由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。b 是双精度型,有效位为十六位。但Turbo C 规定小数后最多保留六位,其余部分四舍五入。

  目前大多数高级语言(包括C)都按照IEEE-754标准来规定数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53位尾数和1位符号位,如下图所示:

  单精度浮点数存储格式

  s 指数 尾数

  31 30 23 22 0

  双精度浮点数存储格式 s 指数 尾数

  63 62 52 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,尾数部分全零。符号位指示正无穷或者负无穷。

  下面举几个例子:

  单精度浮点数 十进制 规格化 符号 移阶码 尾数

  -12 -1.1x23 1 10000010 1000000 00000000 00000000

  0.25 1.0x2-2 0 01111101 0000000 00000000 00000000

  所有字节在内存中的排列顺序,intel的cpu按little endian顺序,motorola的cpu按big endian顺序排列。

  =====================================

  比如+178.125把它按照单精度浮点数的格式进行规格化。

  首先+178的二进制表示为1011 0010

  0.125为0.001

  那么它就是10110010.001,可以看到它的指数应该是7=0b0111它的移码为100000111,相加之后

  应该是

  0 1000 0110 0110 0100 0100,0。。。

×
织梦二维码生成器
时尚女人
育儿知识
生活百科
减肥方法