实数包括有理数和无理数。其中无理数就是无限不循环小数(包括负数中的无限不循环小数),有理数包括整数(包含正整数、负整数和0)和分数(包括正分数和负分数)。数学上,实数直观地定义为和数轴上的点一一对应的数。本来实数仅称作数,后来引入了虚数概念,原本的数称作“实数”意义是“实在的数”(任何实数都可在数轴上表示)。无理数就是平方开不尽的数
实型数据也称为浮点数或实数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。
实数的表示
1) 十进制数形式由数码0~ 9和小数点组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230 等均为合法的实数。
注意,必须有小数点。
2) 指数形式
由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:
a E n(a为十进制数,n为十进制整数)
其值为 a*10 n 。如:
2.1E5 (等于2.1*10 5 )
3.7E-2 (等于3.7*10 -2 )
0.5E7 (等于0.5*10 7 )
-2.8E-2 (等于-2.8*10 -2 )
以下不是合法的实数:
345 (无小数点)
E7 (阶码标志E之前无数字)
-5 (无阶码标志)
53.-E3 (负号位置不对)
2.7E (无阶码)
【例3-5】输出实数。
- #include <stdio.h>
- int main(void){
- printf("%f\n ",356.);
- printf("%f\n ",356);
- printf("%f\n ",356.0);
- return 0;
- }
实数一般占4个字节(32位)内存空间。按指数形式存储。 实数3.14159在内存中的存放形式如下:
![](http://see.xidian.edu.cn/cpp/uploads/allimg/140209/13232323232.gif)
说明:
- 小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。
- 指数部分占的位数愈多,则能表示的数值范围愈大。
实型变量
实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)三类。在VC6.0中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
类型说明符 | 比特数(字节数) | 有效数字 | 数的范围 |
---|---|---|---|
float | 32(4) | 6~7 | 10-37~1038 |
double | 64(8) | 15~16 | 10-307~10308 |
long double | 128(16) | 18~19 | 10-4931~104932 |
- float x,y; // x,y为单精度实型量
- double a,b,c; // a,b,c为双精度实型量
实数的舍入误差
由于实数是由有限的存储单元组成的,因此能提供的有效数字总是有限的。 如下例。【例3-6】实数的舍入误差。
- #include <stdio.h>
- int main(void){
- float a,b;
- a=123456.789e5;
- b=a+20;
- printf("a=%f\n",a);
- printf("b=%f\n",b);
- return 0;
- }
【例3-7】
- #include <stdio.h>
- int main(void){
- float a;
- double b;
- a=33333.33333;
- b=33333.33333333333333;
- printf("a=%f\nb=%f\n",a,b);
- return 0;
- }
从本例可以看出:
- 由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。
- b 是双精度型,有效位为十六位。但VC6.0规定小数后最多保留六位,其余部分四舍五入。
注意:实型常数不分单、双精度,都按双精度double型处理。