您的位置:首页 > 编程语言 > C语言/C++

The New C++ -- 基本数据类型和字面值常量 (7. 浮点型和浮点字面值常量)

2012-02-10 10:24 267 查看
浮点型用来表示实数,他的底层存储和整型不同,所以不被归纳到整型中。浮点数之所以称为浮点数,是因为他的小数点是``浮动''的。他的底层存储包括两部分,第一部分是包括小数点在内的实数部分,例如123.456,第二部分存储小数点向左或者向右浮动几位。就拿123.456为例,小数点如果向左浮动15位,就表示123.456 x 10^{-15}这个数,而向右浮动15位,就表示123.456 x 10^{15}这个数。

浮点型包括float,double和long double这三种类型,其中float源自英文浮点(floating point),double源自英文双精度浮点(double-precision floating point)。这几种类型的不同点是他们的精确度不同,C++标准规定double的精确度要至少和float一样,而long double至少要和double一样。浮点型实数的精确度也是由两部分确定的,第一部分是有效小数位,例如喜马拉雅山的海拔高度是8844.43米,有效数字位就是6位。但如果你说喜马拉雅山的高度是8800米,有效数字位就只有2位,后面的都被约掉了。第二部分就是指数的范围,指数的范围决定了可以表达的最小和最大的实数是多少。C++标准里并没有规定的float,double和long
double的精确度应该是什么,是实现定义的行为,但C++标准规定了他们最少需要支持的精确度,和所表示实数的最大和最小值。如下表,

浮点型占用的内存空间最少有效数字位最少指数范围 所能表达的最少正数范围
float>= 32位6-37到371x10^{-37}到1x10^{37}
double>= 48位10-37到371x10^{-37}到1x10^{37}
long double>= 48位10-37到371x10^{-37}到1x10^{37}
而在现在大部分的电脑系统和编译器所支持的浮点型数据远远超过上面规定,例如Visual C++中,各浮点型所支持的精确度和最大最小值如下表,

浮点型 占用的内存空间 有效数字位 指数范围 所能表达的正数范围
float32位6-37到381.17549 x 10^{-38} 到 3.40282 x 10^{38}
double64位15-307到3082.22507 x 10^{-308} 到 1.79769 x 10^{308}
long double64位15-307到3082.22507 x 10^{-308} 到 1.79769 x 10^{308}
GCC除了long double以外和Visual C++都一样,但long double在GCC中占96位,支持18位有效数字,指数表达范围是-4931到4932,实数表示范围是3.3621 x 10^{-4932}到1.18973 x 10^{4932}之间。浮点型的具体大小可以用sizeof表达式得知。

练习:

将float分别替换为double或者long double,查看你的编译器支持的浮点型数据的精确度和表达的范围。

有效数字位:numeric_limits<float>::digits10

指数部分最小值:numeric_limits<float>::min_exponent10

指数部分最大值: numeric_limits<float>::max_exponent10

实数部分最小值:numeric_limits<float>::min()

实数部分最大值: numeric_limits<float>::max()

有两种方法可以表达浮点字面值常量。第一种方法就像我们写实数一样,例如3.14159。注意3.14159是一个double类型的字面值常量,表示float或者long double,要分别加上F或者L的后缀(大小写都可以)。这种方法必须有一个小数点,以和整数字面值常量区分。有时候小数点前面或者后面的数字可以不写,例如8844.就表示8844.00,而.8844就表示0.8844。

第二种方法是十进制指数表达法。具体方法是先写一个实数,然后再在他后面加上E(或者e)再加上一个正号或者负号(正号可以省略),最后加上一个整数。E后面的正整数或者负整数表示小数点向右或者向左移动几位。例如8.844E3表示 8.844 x 10^3,而88440E-1则表示88440 x 10^{-1}。

练习:

指出下面实数分别是什么类型的浮点字面值常量。

3.14159E+8L,3.14F,31000E-30
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: