【2023最新】C语言教程 第3章 数据和C 3.4 C语言基本数据类型 3.4.6 float、double和long double

本文介绍了C语言中的浮点类型,包括float、double和longdouble,详细讲解了它们的精度、存储方式以及如何声明和打印浮点型变量。还讨论了浮点数的上溢、下溢和舍入误差问题,强调了浮点计算的限制和潜在的精度损失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【2023最新】C语言教程

第3章 数据和C

在这里插入图片描述

3.4 C语言基本数据类型
3.4.6 float、double和long double

C语言中的浮点类型有float、double和long double类型。

浮点类型可以表示小数在内的更大范围的数,浮点数的表示类似于科学计数法(即用小数乘以10 的幂来表示数字)

数字科学计数法指数计数法
10000000001.0 X 1 0 9 10^9 1091.0e9
1230001.23 X 1 0 5 10^5 1051.23e5
322.5632256 X 1 0 2 10^2 1023.2256e2
0.0000565.6 X 1 0 − 5 10^{-5} 1055.6e - 5

C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是 1 0 − 37   1 0 + 37 10^{-37}~10^{+37} 1037 10+37

  • 前一项规定指float类型必须至少精确表示小数点后的6位有效数字,如33.333333。
  • 后一项规定用于方便地表示诸如太阳质量(2.0e30千克)、一个质子的电荷量(1.6e-19库仑)或国家债务之类的数字。

通常,系统储存一个浮点数要占用32位。其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号。

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

一般情况下,double占用64位而不是32位。一些系统将多出的32位全部用来表示非指数部分,这不仅增加了有效数字的位数(即提高了精度),而且还减少了舍入误差。

另一些系统把其中的一些位分配给指数部分,以容纳更大的指数,从而增加了可表示数的范围。无论哪种方法,double类型的值至少有13位有效数字,超过了标准的最低位数规定。

C语言的第3种浮点类型是long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。

【1】声明浮点型变量
float noah , jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
【2】浮点型常量

在代码中,可以用多种形式书写浮点型常量。浮点型常量的基本形式是:

有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号数表示10的指数。下面是两个有效的浮点型常量:

-1.56E+12
2.87e-3
  • 正号可以省略
  • 可以没有小数点 (2E5) 或指数部分 (19.28),但是不能同时省略两者
  • 可以省略小数部分(3.E16) 或整数部分( .45E-6),但是不能同时省略两者
3.14159
.2
4e16
.8E-5
100.

【强调】别在浮点型常量中间加空格

默认情况下,编译器假定浮点型常量是double类型的精度。

  • 在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f 或 9.11E9F
  • 使用l或L后缀使得数字成为long double类型
  • 没有后缀的浮点型常量是double类型。

C99标准添加了一种新的浮点型常量格式——用十六进制表示浮点型常量,即在十六进制数前加上十六进制前缀(0x或0X),用p和P分别代替e和E,用2的幂代替10的幂(即,P计数法)。如下所示:

Oxa.1fpl0

十六进制a等于十进制10,.1f是1/16加上15/256(十六进制f等于十进制15),p10是 2 10 2^{10} 210或1024。

0xa.1fp10表示的值是(10+1/16+15/256)×1024(即,十进制10364.0)。

注意,并非所有的编译器都支持C99的这一特性。

【3】打印浮点值

printf()函数

  • 使用%f转换说明打印十进制记数法的float和double类型浮点数
  • 用%e打印指数记数法的浮点数。

如果系统支持十六进制格式的浮点数,可用a和A分别代替e和E。打印long double类型要使用%Lf、%Le或%La转换说明。给那些未在函数原型中显式说明参数类型的函数(如,printf())传递参数时,C编译器会把float类型的值自动转换成double类型。

#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);
	
	printf("And it's %a in hexadecimal, powers 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;
}

在这里插入图片描述

【4】浮点值的上溢和下溢
  • 上溢:当计算导致数字过大,超过当前类型能表达的范围时,发生上溢。

    现在C 语言规定,在这种情况会给toobig 赋一个表示无穷大的特定值。

    在这里插入图片描述

  • 当除以一个很小的数时,情况更为复杂。

    在计算过程中损失了原末尾有效位上的数字,这种情况 → 下溢。

    C 语言把损失了类型全精度的浮点值称为 低于正常的浮点值。

还有一个特殊的浮点值NaN(Not a Number)。

【浮点数舍入错误】

给定一个数,加上1,再减去原来给定的数,结果是多少?

#include<stdio.h>

int main(void){
	
	float a, b;
	
	b = 2.0e20 + 1.0;
	a = b - 2.0e20;
	
	printf("%f \n", a);
	
	return 0;
	
}

在这里插入图片描述

原因:计算机缺少足够的小数位来完成正确的运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祝我天天开心,平安健康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值