网站地图
浮点型

在计算机系统的发展过程中,曾经提出过多种方法表示实数,但是到目前为止使用最广泛的是浮点表示法。相对于定点数而言,浮点数利用指数使小数点的位置可以根据需要而上下浮动,从而可以灵活地表达更大范围的实数。

浮点数是一串0和1构成的位序列(bit sequence),从逻辑上用三元组{S,E,M}表示一个数N,如下图所示:

N的实际值n由右边的式子表示:

其中:

★ n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一串二进制位。

★ S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n≤0时,s=1。

★ E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也可正可负。

★ M(mantissa)表示N的尾数位,恰好,它位于N末尾。M也叫有效数字位(significand)、系数位(coefficient), 甚至被称作"小数"。

浮点数表示法利用科学计数法来表达实数(real),当计算的表达式有精度要求时被使用。例如,计算平方根,或超出人类经验的计算如正弦和余弦,它们的计算结果的精度要求使用浮点型。在IEEE标准754之前,业界并没有一个统一的浮点数标准,直到1985年Intel打算为其的8086微处理器引进一种浮点数协处理器时,才请加州大学伯克利分校的 William Kahan教授──最优秀的数值分析家之一来为8087 FPU设计浮点数格式; 而这个家伙又找来两个专家来协助他,于是就有了KCS组合(Kahan, Coonan, and Stone)。他们共同完成了Intel的浮点数格式设计,而且完成地如此出色,以致于IEEE组织决定采用一个非常接近KCS的方案作为IEEE的标准浮点格式。目前,几乎所有计算机都支持该标准,大大改善了科学应用程序的可移植性。C标准规定的浮点型有float、double、long double,和整型一样,既没有规定每种类型占多少字节,也没有规定采用哪种表示形式。浮点数的实现在各种平台上差异很大,有的处理器有浮点运算单元(FPU,Floating Point Unit),称为硬浮点(Hard-float)实现;有的处理器没有浮点运算单元,只能做整数运算,需要用整数运算来模拟浮点运算,称为软浮点(Soft-float)实现。大部分平台的浮点数实现遵循IEEE 754,float型通常是32位,double型通常是64位。 long double型通常是比double型精度更高的类型,但各平台的实现有较大差异。在x86平台上,大多数编译器实现的long double型是80位,因为x86的浮点运算单元具有80位精度,gcc实现的long double型是12字节(96位),这是为了对齐到4字节边界,也有些编译器实现的long double型和double型精度相同,没有充分利用x86浮点运算单元的精度。其它体系结构的浮点运算单元的精度不同,编译器实现也会不同,例如PowerPC上的long double型通常是128位。

以前我们只用到最简单的浮点数常量,例如3.14,现在看看浮点数常量还有哪些写法。由于浮点数在计算机中的表示是基于科学计数法的,所以浮点数常量也可以写成科学计数法的形式,尾数和指数之间用e或E隔开,例如314e-2表示314×10的-2次方,注意这种表示形式基数是10,如果尾数的小数点左边或右边没有数字则表示这一部分为零,例如3.e-1,.987等等。浮点数也可以加一个后缀,例如3.14f、.01L,浮点数的后缀和类型之间的对应关系比较简单,没有后缀的浮点数常量是double型的,有后缀f或F的浮点数常量是float型的,有后缀l或L的浮点数常量是long double型的。

名称

位数

数的范围

double

64

1.7E308~1.7E+308

float

32

3.4E38~3.4E+38

下面讨论浮点型的两种类型。

1 .单精度浮点型(float)

单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。

这是一些声明单精度浮点型变量的例子:float hightemp,lowtemp;

2 .双精度型(double )浮点型

双精度型,正如它的关键字“double ”表示的,占用64位的存储空间。在一些现代的被优化用来进行高速数学计算的处理器上双精度型实际上比单精度的快。所有超出人类经验的数学函数,如sin( ),cos( ) ,tan()和sqrt( )均返回双精度的值。当你需要保持多次反复迭代的计算的精确性时,或在操作值很大的数字时,双精度型是最好的选择。

具体有三种形式:

IEEE754三种浮点数的格式参数

类型 存储位数 偏移值

数符(s)

阶码(E)

尾数(M)

总位数

十六进制

短实数(Single,Float)

1位

8位

23位

32位

0x7FH +127

长实数(Double)

1位

11 位

52位

64位

0x3FFH +1023

临时实数(延伸双精确度,不常用)

1位

15位

64位

80位

0x3FFFH +16383

对于阶码为0或为255(2047)的情况,IEEE有特殊的规定:

如果 E 是0 并且 M 是0,这个数±0(和符号位相关) 如果 E = 2 1 并且 M 是0,这个数是 ±无穷大(同样和符号位相关) 如果 E = 2 1 并且 M 非0,这个数表示为不是一个数(NaN)。

标准浮点数的存储在尾数中隐含存储着一个1,因此在计算尾数的真值时比一般形式要多一个整数1。对于阶码E的存储形式因为是127的偏移,所以在计算其移码时与人们熟悉的128偏移不一样,正数的值比用128偏移求得的少1,负数的值多1,为避免计算错误,方便理解,常将E当成二进制真值进行存储。例如:将数值-0.5按IEEE754单精度格式存储,先将-0.5换成二进制并写成标准形式:-0.510=-0.12=-1.0×2-12,这里s=1,M为全0,E-127=-1,E=12610=011111102,则存储形式为:

1 01111110 000000=BE000000(16)

这里不同的下标代表不同的进制。

浮点数(也叫浮点数,双精度数或实数)可以用以下任何语法定义:

<?php$a = 1.234;$a = 1.2e3;$a = 7E-10;?>

形式上:

LNUM [0-9]+DNUM ([0-9]*[/.]{LNUM}) | ({LNUM}[/.][0-9]*)EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})

转换为浮点数

如果希望了解有关何时和如何将字符串转换成浮点数的信息,请查阅“将字符串转换为数值”一节。对于其它类型的值,其情况类似于先将值转换成整型,然后再转换成浮点。请参阅“转换为整型”一节以获取更多信息。自 php 5 起,如果试图将对象转换为浮点数,会发出一条通知。


相关文章推荐:
实数 | 浮点数 | 浮点数 | 实数 | 表达式 | 微处理器 | 协处理器 | 加州大学伯克利分校 | 浮点数 | 整型 | 字节 | 浮点运算单元 | 浮点数 | 编译器 | 浮点运算单元 | 字节 | 浮点数 | 常量 | 单精度浮点型 | 浮点数 | 浮点数 |
相关词汇词典