| [b]18. 基本数据类型:浮点类型 [/b] |
|
[b]1. float, double, [/b][b]以及 long double[/b]
前面所说的数据类型只能用于处理整数。如果我们需要使用小数,就要使用[b]浮点类型[/b]([b]floating-point[/b])。C 提供了三种浮点类型:[b]float[/b],[b] double以及 long double[/b]。,
C 标准要求[b]float[/b] 类型至少要能[b]精确表示到小数点后6位[/b],并且整数部分的表示范围至少要达到 [b]10-37 [/b][b]--[/b][b] 10+37[/b]。[b]float[/b] 一般是[b]32[/b] 位的。
C 标准规定[b]double[/b] 类型的整数部分的最小表示范围和 float 一样,都是 [b]10-37 [/b]到[b] 10+37[/b],但是它要求 double 类型的小数部分至少要能精确到小数点后[b]10[/b] 位。double 通常是 64 位的。
C 还提供了[b]long double[/b] 类型,目的是提供一种比 double 更加精确的类型。然而,C 标准仅仅规定 long double 至少要和 double 一样精确。
[b][/b]
[b]2. [/b][b]声明浮点型变量[/b]
浮点型变量的声明和初始化与整型变量一样。例如:
float f_1, f_2;
double d_1;
float f_3 = 6.63;
long double ld_1;
[b]3. [/b][b]浮点型常量[/b]
浮点型常量有多种写法。其基本形式为:首先写[b]整数部分[/b](可以带符号),接着写[b]小数部分[/b],然后写[b]e[/b] 或者[b]E[/b],最后再写一个[b]有符号整数[/b]。例如:
+1.2E+5
1.5e-9
-5.0e10
其中 e 或 E 被称为[b]阶码标志[/b],e 或 E 后面的有符号整数被称为[b]阶码[/b]。阶码代表[b]10 的阶码次方[/b]。例如:+1.2E+5 的值是[b]1.2 * [/b][b]10[/b][b]5[/b]。假设 A 为 e 前面的部分,N 是 e 后面的部分,则 AeN 等于[b]A * [/b][b]10[/b][b]N[/b]。此外,[b]正号[/b]可以省略不写。[b]小数部分[/b]也不是必需的,也就是说,[b]5e3[/b] 也是正确的。阶码标志和阶码也可以不写,如:[b]13.5[/b]。小数点后面,阶码标志之前的那部分整数可以不写(9.E5),小数点之前的整数也可以不写([b].96e-8[/b]),但是不能同时都不写。例如:
56.
.5
3.14
3e6
.6E-8
[b]注意:[/b]浮点型常量中[b]不能有空格![/b]例如:
3.21e -12 /* 有空格,错! */
3.14 e5 /* 有空格,错! */
浮点型常量默认是[b]double[/b] 类型的。假设 var_f 是 float 类型的变量,如果有以下语句:
var_f = 9.0 * 3.0;
那么 9.0 和 3.0 都是 double 类型的常量。它们的乘积也是 double 型的。在进行赋值的时候,这个乘积被转化成 float 类型,然后再赋值给 var_f。
当然,我们也可以指定浮点型常量的类型。在浮点型常量后面添上[b]f[/b] 或者[b]F[/b],编译器就会用[b]float[/b] 类型来处理这个常量。例如:[b]1.5f[/b],[b]2.1e6F[/b]。在后面添上[b]l[/b] 或者[b]L[/b] 的话,编译器会用[b]long double[/b] 类型来处理这个常量。例如:[b]4.1l[/b],[b]50.2E5L[/b]。最好用大写[b]L[/b],因为小写[b]l[/b] 容易和数字 1 混淆。
C99 新增了一种表示浮点型常量的格式:使用十六进制前缀(0x 或 0X,0 是[b]数字 0[/b],不是字母 o ),用[b]p[/b] 或[b]P[/b] 代替前面所说的 e 或 E,而且阶码代表的是[b]2 的阶码次方[/b]。例如:
0xb.1ep5
其中[b]b[/b] 等于十进制中的 11,[b].1e等于 1/16[/b] 加[b]14/256[/b], p5 等于 [b]2[/b][b]5[/b],也就是 512。这个浮点型常量转换成十进制就是:[b](11 + 1/16 + 14/256)*[/b][b]2[/b][b]5[/b][b]= 5692[/b]
[b]注意:[/b]并非所有编译器都支持 C99 新增的这种格式!
[b]4. [/b][b]输出浮点数[/b]
格式限定符[b]%f[/b] 命令 printf 函数以十进制形式输出 float 和 double 类型的浮点数;[b]%e [/b]命令 printf 函数以指数形式输出float 和 double 类型的浮点数;[b]%a[/b] 或[b]%A[/b] 命令 printf 函数以 C99 新增的那种十六进制格式输出,但是并非所有编译器都支持。如果您要输出[b]long double[/b] 类型的浮点数,请用[b]%Lf[/b],[b]%Le[/b],[b]%La[/b],或者[b]%LA[/b]。例如:
/* showfloat.c – 用两种形式表示浮点数 */
#include[b]<[/b]stdio.h[b]>[/b]
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
[b]注意:[/b]以上是我在 Suse Linux 10 下使用 gcc 4.02 编译运行得到的输出。如果使用 Dev-C++ 4.9.9.2 编译运行本程序,则不能正常输出 var_ld。大概是因为 Dev-C++ 使用的编译器 gcc 中,long double 是 96 位的,而它使用函数库中的 printf 函数却把 long double 当作 64 位的来处理。
[b]5. [/b][b]浮点数上溢(Overflow)和下溢(Underflow)[/b]
假设您的编译器中,float 最大只能达到 3.4e38,如果有以下语句:
float toobig = 3.4E38 * 100.0f;
printf("%e\n", toobig);
这必然导致上溢!因为 toobig 无法表示 3.4E38 和 100.0f 的乘积。上溢的后果过去是没有定义的,不过现在 C 规定如果发生上溢,则产生一个表示[b]无穷大[/b]的特殊值。因此,toobig 的值最终会变成一个表示[b]无穷大[/b]的特殊值。进而,printf 函数会输出类似 inf 或者 infinity 的字眼。
对一个绝对值非常小的浮点数进行除法,并且导致这个浮点数的精度降低,称之为[b]下溢[/b]。打个比方,假设 3.1415e-10 除以 10 后,变成 0.3141e-10,这就是下溢。 |
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有