C语言学习【C语言基本数据类型二】

C语言学习【C语言基本数据类型二】

_Bool类型

C99标准添加了_Bool类型,用于表示布尔值,即逻辑值truefalse,原则上仅占用1位存储空间;

float、double和long double

记数法示例

C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是 1 0 − 37   1 0 + 37 10^{-37} ~ 10^{+37} 1037 10+37,通常,系统存储一个浮点数要占用32位;其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号。

C语言提供的另一种浮点类型为double(意为双精度),double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字,一般情况下,double占用64位;

C语言的第3中浮点类型是long double,以满足比double类型更高的精度要求;

声明浮点型变量

float noah, jonah;
double trouble;

float planck = 6.63e-34;

long double gnp;

浮点型常量

浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或者E,最后是一个有符号数表示10的指数:

-1.56E+12
2.87e-3

正好可以省略,可以么有小数点(如,2E5)或指数部分(如,19.28),但是不能同时省略两者:

3.14159
.2
4e16
.8E-5
100.

不要在浮点型常量中间加空格:1.56 E+12这种写法错误;

通常,编译器假定浮点型常量是double类型的精度,在浮点数后面加上fF后最可覆盖默认设置,使用lL后缀使得数字成为long double类型;

C99标准可以用十六进制表示浮点型常量,在十六进制数前加上十六进制前缀(0x0X),用pP分别代替eE,用2的幂代替10的幂,例如0xa.1fp10,十六进制a等同于十进制10.1f1/16加上15/256p10 2 10 2^{10} 2101024
0xa.1fp10表示的值是(10 + 1/16 + 15/256)X1024,即十进制10346.0

打印浮点值

/* 以两种方式显示float类型的值 */

#include "stdio.h"

int main(void)
{
    float aboat = 32000.0;
    double abet = 2.14e9;

    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);

    /* 编译器支持C99 或其中的相关特性 */
    printf("And it's %a in hexadecimal, power of 2 notation\n", aboat);

    printf("%f can be written %e\n", abet, abet);

    printf("%Lf can be written %Le\n", dip, dip);

    return 0;
}

程序输出结果

32000.000000 can be written 3.200000e+004
/* 编译器不支持C99 */
And it's 0x1.f40000p+14 in hexadecimal, power of 2 notation
2140000000.000000 can be written 2.140000e+009
0.000000 can be written 3.172882e-317

浮点值的上溢和下溢

/* 浮点值的上溢和下溢 */

#include "stdio.h"

int main(void)
{
    float toobig = 3.4E38 * 100.0f;

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

}

输出结果

1.#INF00e+000

上述程序为一个上溢(overflow)的示例,C语言规定,在这种情况放下给toobig赋值一个表示无穷大的值;

/* 浮点数舍入错误 */

#include "stdio.h"

int main(void)
{
    /* float 类型变量智能存储按指数比例缩小或方法的6或7位有效数字 */
    float a,b;
    b = 2.0e20 + 1.0;
    a = b - 2.0e20;

    printf("%f \n", a);

    return 0;

}

程序运行结果

4008175468544.000000

显而易见,结果是错误的,float缺少左右的小数位来完成正确的运算.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值