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++标准规定了他们最少需要支持的精确度,和所表示实数的最大和最小值。如下表,
而在现在大部分的电脑系统和编译器所支持的浮点型数据远远超过上面规定,例如Visual C++中,各浮点型所支持的精确度和最大最小值如下表,
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
浮点型包括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到37 | 1x10^{-37}到1x10^{37} |
double | >= 48位 | 10 | -37到37 | 1x10^{-37}到1x10^{37} |
long double | >= 48位 | 10 | -37到37 | 1x10^{-37}到1x10^{37} |
浮点型 | 占用的内存空间 | 有效数字位 | 指数范围 | 所能表达的正数范围 |
float | 32位 | 6 | -37到38 | 1.17549 x 10^{-38} 到 3.40282 x 10^{38} |
double | 64位 | 15 | -307到308 | 2.22507 x 10^{-308} 到 1.79769 x 10^{308} |
long double | 64位 | 15 | -307到308 | 2.22507 x 10^{-308} 到 1.79769 x 10^{308} |
练习:
将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
相关文章推荐
- The New C++ -- 基本数据类型和字面值常量 (5. 宽字符类型和宽字符字面值常量)
- The New C++ -- 基本数据类型和字面值常量 (3. sizeof表达式和typeid表达式)
- The New C++ -- 基本数据类型和字面值常量 (8. 字符串字面值常量)
- The New C++ -- 基本数据类型和字面值常量 (4. 字符型和字符字面值常量)
- The New C++ -- 基本数据类型和字面值常量 (6. 布尔型和布尔字面值常量)
- The New C++ -- 基本数据类型和字面值常量 (1)
- The New C++ -- 基本数据类型和字面值常量 (2. 整型和整数字面值常量)
- C++基本数据类型字面值
- c++ 中常量与变量 基本数据类型
- C++系列之基本数据类型、常量、变量、const、引用、typedef、枚举、类类型、编写自己的头文件
- c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:
- 【C++】基本的数据类型(二) 字符型常量的表示方法
- C++程序员学Java系列之五:常量,变量,基本数据类型及转换
- CPU位数、操作系统位数、计算机字长、C/C++基本数据类型长度
- C/C++基本数据类型长度
- C/C++基本数据类型所占字节数
- C++基本数据类型与输入输出
- C++与Java基本数据类型比较
- 基本数据类型所占的字节数【C/C++】
- C/C++——基本数据类型的大小并且sizeof(int *) = 8