回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C 语言基础教程 >> 18. 基本数据类型:浮点类型
最 近 更 新
54. goto 语句
53. switch 语句推荐
52. continue 和 break
51. 条件运算符(?:)
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
46. if 语句
45. 循环应用实例 2
最 新 推 荐
53. switch 语句推荐
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
44. 循环应用实例 1推荐
43. 循环嵌套推荐
40. for 循环推荐
37. 关系运算符推荐
36. while 循环推荐
热 门 排 行
2. 第一个 C 程序推荐
31. 预处理指令 #define..推荐
1. C 语言简介
11. 基本数据类型:整型..推荐
24. 运算符的优先级和结..推荐
5. 如何编写函数
30. 字符串字面量推荐
13. 标识符命名规则
36. while 循环推荐
7. 第三个 C 程序推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

18. 基本数据类型:浮点类型


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品
发布于2006-01-20 22:03 被读3283次 【字体:

Antigloss 最后修改于 2006-12-26

 

1. float, double, 以及 long double

 

前面所说的数据类型只能用于处理整数。如果我们需要使用小数,就要使用浮点类型floating-point)。C 提供了三种浮点类型:float, double, 以及 long double注意,unsigned/signed 不能用于修饰浮点类型。浮点类型可以处理正数,也能处理负数。没有无符号浮点型

 

C 标准要求 float 类型至少要能精确表示到小数点后6float 一般是 32 位的。

 

C 标准规定 double 类型至少要能精确到小数点后 10 位。double 通常是 64 位的。

 

    C 还提供了 long double 类型,目的是提供一种比 double 更加精确的类型。然而,C 标准仅仅规定 long double 至少要和 double 一样精确。long double 通常 96 位或者 128 位。

 

 

2. 声明浮点型变量

 

    浮点型变量的声明和初始化与整型变量一样。例如:

 

float f_1, f_2;

double d_1;

float f_3 = 6.63;

long double ld_1;

 

 

3. 浮点型常量

 

浮点型常量有多种写法。其基本形式为:首先写整数部分(可以带符号),接着写小数部分,然后写 e 或者 E,最后再写一个有符号整数。例如:

 

+1.2E+5
1.5e-9
-5.0e10

 

其中 e E 被称为阶码标志e E 后面的有符号整数被称为阶码。阶码代表 10 的阶码次方。例如:+1.2E+5 的值是 1.2 * 105。假设 A e 前面的部分,N e 后面的部分,则 AeN 等于 A * 10N。此外,正号可以省略不写。小数部分也不是必需的,也就是说,5e3 也是正确的。阶码标志和阶码也可以不写,如:13.5。小数点后面,阶码标志之前的那部分整数可以不写(9.E5),小数点之前的整数也可以不写(.96e-8),但是不能同时都不写。例如:

 

56.
.5
3.14
3e6
.6E-8

 

注意:浮点型常量中不能有空格!例如:

 

3.21e -12     /*  有空格,错! */

3.14 e5       /*  有空格,错! */

 

浮点型常量默认是 double 类型的。假设 var_f float 类型的变量,如果有以下语句:

 

var_f = 9.0 * 3.0;

 

那么 9.0 3.0 都是 double 类型的常量。它们的乘积也是 double 型的。在进行赋值的时候,这个乘积被转化成 float 类型,然后再赋值给 var_f

 

    当然,我们也可以指定浮点型常量的类型。在浮点型常量后面添上 f 或者 F,编译器就会用 float 类型来处理这个常量。例如:1.5f2.1e6F。在后面添上 l 或者 L 的话,编译器会用 long double 类型来处理这个常量。例如:4.1l50.2E5L。最好用大写 L,因为小写 l 容易和数字 1 混淆。

 

    标准规定,对于 float 型,E 后面的阶码的取值范围至少要达到 -37 到 +37。对 double 和 long double 的规定同样如此。

 

    C99 新增了一种表示浮点型常量的格式:使用十六进制前缀(0x 0X0 数字 0,不是字母 o ),用 p P 代替前面所说的 e E,而且阶码代表的是 2 的阶码次方。例如:

 

0xb.1ep5

 

其中 b 等于十进制中的 11, .1e 等于 1/16 14/256, p5 等于 25,也就是 512。这个浮点型常量转换成十进制就是:(11 + 1/16 + 14/256)*25 = 5692

 

注意:并非所有编译器都支持 C99 新增的这种格式!

 

 

4. 输出浮点数

 

    格式限定符 %f 命令 printf 函数以十进制形式输出 float double 类型的浮点数;%e 命令 printf 函数以指数形式输出float double 类型的浮点数;%a %A 命令 printf 函数以 C99 新增的那种十六进制格式输出,但是并非所有编译器都支持。如果您要输出 long double 类型的浮点数,请用 %Lf%Le%La,或者 %LA。例如:

 

/* showfloat.c – 用两种形式表示浮点数 */

 

#include <stdio.h>

 

int main(void)

{

    float var_f = 5.0;

    double var_df = 3.14e2;

    long double var_ld = 6.51e-5;

 

    printf("%f is equal to %e\n", var_f, var_f);

    printf("%f is equal to %e\n", var_df, var_df);

    printf("%Lf is equal to %Le\n", var_ld, var_ld);

 

    return 0;

}

 

输出如下:

 

5.000000 is equal to 5.000000e+00

314.000000 is equal to 3.140000e+02

0.000065 is equal to 6.510000e-05 

 

注意:以上是我在 Suse Linux 10 下使用 gcc 4.02 编译运行得到的输出。如果使用 Dev-C++ 4.9.9.2 编译运行本程序,则不能正常输出 var_ld。大概是因为 Dev-C++ 使用的编译器 gcc 中,long double 96 位的,而它使用函数库中的 printf 函数却把 long double 当作 64 位的来处理。

 

 

5. 浮点数上溢(Overflow)和下溢(Underflow

 

    假设您的编译器中,float 最大只能达到 3.4e38,如果有以下语句:

 

float toobig = 3.4E38 * 100.0f;

printf("%e\n", toobig);

 

这必然导致上溢!因为 toobig 无法表示 3.4E38 100.0f 的乘积。上溢的后果过去是没有定义的,不过现在 C 规定如果发生上溢,则产生一个表示无穷大的特殊值。因此,toobig 的值最终会变成一个表示无穷大的特殊值。进而,printf 函数会输出类似 inf 或者 infinity 的字眼。

 

    对一个绝对值非常小的浮点数进行除法,并且导致这个浮点数的精度降低,称之为下溢。打个比方,假设 3.1415e-10 除以 10 后,变成 0.3141e-10,这就是下溢。

 

 

6. 浮点型的选用

 

    通常,double 是最好的选择,因为其精度较高,而且导致的运行时耗费相对 float 也多不了多少。

 

 

参考资料:C Primer 5th Edition

                     C99 标准

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C 语言数据类型
38. 布尔类型再探讨
30. 字符串字面量

上一篇:17. 基本数据类型:布尔型(_Bool type)
下一篇:19. 基本数据类型:复数类型和虚数类型

共有评论 0 条 网友评分 0分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss