c语⾔中实型标准,C语⾔中的基本数据类型--实型数据
C语⾔⾥⾯关于double类型的打印:%lf , %le , %lE
e/E是指数形式的,不过e打印的是⼩写,E打印的是⼤写。
g/G会截断⼀些⼩数,⽐较不精确。
%e double Signed value having the form [ – ]d.dddd e [sign]ddd where d is a single decimal digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or –.
%E double Identical to the e format except that E rather than e introduces the exponent.
%f double Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.
彼得与狼交响童话%g double Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is ud only when the exponent of the value is less than
–4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.
%G double Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).
⼀、实型常量
实型也称为浮点型,实型常量也称为实数或浮点数。
1.在纯C中,实型常量只能⽤⼗进制表⽰,但是有两种形式。
(1)⼗进制⼩数形式:由数字0-9以及⼩数点构成,其中,⼩数点是必不可少的,如356.0、12.2等都是合法实数,65不是合法实数,因为缺少了⼩数点。
(2)指数形式:由⼗进制数加阶码标志“E/e”组成,⼀般形式为a E n,其中a为⼗进制整数,E为阶码标志,n为⼗进制整数作为阶码,如123E5表⽰123*10^5,使⽤指数形式时,要注意E之前必须有数字,之后的阶码必须为整数。和数学中的科学计数法不同,⼀个实数可以有多种指数形式,如123.789可以表⽰为1.23789E2或12.3789E1或0.123789E3这些都是合法的,但是只有第⼀种才是规范化的指数形式,程序唉输出结果时都是以该种形式输出,但是其他形式在使⽤是也没有任何错误。
2.在纯C中,也可以使⽤后缀“F/f”来声明⼀个数是浮点数,如365F和365.0是等价的。
3.实例程序
main()
{
printf("%f\n",365.0);
printf("%f\n",365);
printf("%f\n",365F);
}
运⾏结果是
365.000000
0.000000
365.000000
第⼆⾏输出错误的原因是,由于在使⽤时没有加⼊⼩数点,也没有使⽤后缀F将其声明为浮点数,所以365不是合法实数,不被编译器认可。
⼆、实型变量
1.实型数据在内存中的存放形式:实型数据在内存中被分为符号部分,⼩数部分和指数部分三部分存放,例如-1.23456在内存中被分
为“-”、“.123456”、“1”三个部分,⼀个实型数据占⽤4个字节的内存空间(1byte=8bits)通常,⼀般的C语⾔编译器会占⽤24位存放⼩数,8位存放指数,事实上,电脑在存取⼩数部分时,是以⼆进制形式的,⽽指数部分则是以2的幂指数形式存放的。
2.实型数据的⼩数位数越多,代表有效数字越多,精度也就越⾼,⽽指数位数越多,器表⽰的数的范围就越⼤。
3.实型变量的分类:实型变量可以分为三类,
(1)单精度型:占⽤4字节内存空间,数值范围为3.4E-38到3.4E+38,有效数字为七位。
(2)双精度型:占⽤8字节内存空间,数值范围为1.7E-308到1.7E+308,有效数字为⼗六位。
(3)长双精度型:只是知道有这种数据类型,不过没有具体的数据,那位⾼⼈知道的话请补充⼀下。
4.实型变量的定义格式和规则与整型数据相同,所以每⼀个实型数据在使⽤前必须先定义。
实例:师任堂
float m,n; /*定义m,n为单精度实型变量*/
double a,b,c; /*定义a,b,c为双精度实型变量*/
实例2:鸡肉馅饺子
main()
{
float a;
double b;
坏学生a=5555.55555;
b=5555.5555555555;
printf("%f\n%f\n",a,b);
}
运⾏结果为5555.555664猪肉白菜馅饼
5555.555556
分析:变量a被定义为float,变量b被定义为double,所以a的有效数字为七位,所以输出时5555.555之后的数字是⽆效的,⽽b的有效数字虽然为⼗六位,但是由于具体编译器的限制,只运算到⼩数点后六位,其余位数四舍五⼊。
P.s编程技巧:对于实型数据,由于精度差别,⼤⼩差异极⼤的数值直接进⾏运算可能会丢失⼀部分数据。
王安忆三、puzzle from:
float c = 12.5;printf("%d\n", c);printf("%d\n", *(int *)&c);
重装系统步骤
参考答案:该项程序输出如下所⽰,010********原因是:浮点数是4个字节,12.5f 转成⼆进制是:01000001010010000000000000000000,⼗六进制是:0×41480000,⼗进制是:1095237632。这是第⼆个输出的原因。对于第⼀个,为什么会输出0,我们需要了解⼀下float和double的内存布局,如下:float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
谦让的反义词
double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)
然后,我们还需要了解⼀下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存⼆进制完全不⼀样。别忘了在x86芯⽚下使⽤是的反字节序,⾼位字节和低位字位要反过来。所以:float版:0×41480000 (在内存中是:00 00 48 41)
double版:0×4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)
⽽我们的%d要求是⼀个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出⾃然是0了。
这个⽰例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。