原文链接

浮点型:数学里的小数

C语言浮点型有三个类型:float、double、long double

输入输出输出格式符: 默认输出6位小数

float–%f
double、long double–%lf 不初始化不行
%e 科学记数法,形式如:2.23e2其中e–10

float

内存大小:4字节,由sizeof(float)获取

表示范围:-2^128 ~ +2^128,也即约-3.40282e+38 ~ +3.40e+38

这些数不用记,知道范围超级大就行了

标准规定:float指数范围不小于-37~38,e是10,所以有的环境下,精度会高一些

默认范围:头文件 float.h宏 FLT_MIN

有效数位:float也叫单精度浮点型

ANSI C规定最小值是6,有的编译器可能8位,可能7位

注意不是小数的位数,是以第一个非0数字开始数6位
比如:12345.6789,6位精度位指的是12345.6,后面得789就是非精度位,也就是不要考虑了,789将会是不精确存储。

0.00012456789,6位精度位指的是123456,789就不用考虑是否准确了

double

内存大小:8字节,由sizeof(double)获取

表示范围:-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308

标准规定:double指数范围不小于-3738,实际实现-307308

有效数位:double又叫双精度浮点型

ANSI C规定最小值是10位, 多数编译器是15,16,17位左右

long double

内存大小:规定不小于double的长度,至少8字节,不同的编译器这个字节数可能不同,有的是8,有的是10,有的是12,有的甚至更大。那么这个字节数就以自己使用的编译器为准,测一下,知道有这个区别。

表示范围:那这个就依据大家自己的测试,字节数越大,精度就越大

Visual Studio里long double跟double是一样8字节

测试gcc,是12字节

有效数位:ANSI C规定最小值是10位,实际中依据环境具体实现,vs测是18位

后缀:

后缀:

L /l 0.2l/0.2L long double数据

无后缀:

0.2 double数据

后缀:

F/f 0.2F/0.2f float数据

问题:如果不是对应的,会涉及到类型转换,类型转换的结果可能会造成内存截断,导致数据不是我们想要的,所以需要尽量保持一致

为啥要转换:只有数值类型一样了,计算机才能进行计算,不一样就转成一样的

输入输出

printf输出浮点型

%f,%lf这两个都行,输出没有严格要求,默认是6位小数,第六位四舍五入

%5.2f /lf

5代表整个数占据屏幕多少个字符位,多了有效果,少了无效果

. 表示小数点

2表示小数的位数,第二位是四舍五入

%e 科学记数法。123.34输出1.233400e+02

默认6位小数,也可控制%.4e,就输出1.2334e+02

e是10,

+02是正2次方

scanf输入浮点型
float %f
double %lf
long double %lf
输入浮点型,格式符一定要跟类型对应上,否则就出错

浮点型的存储

float:1bit(符号位) 8bits(指数位) 23bits(尾数位)

最高位是符号位:1代表负数,0代表正数
指数位:-2^7~ 2^7-1 -128~127
有效数位(尾数位):2^23 8388608 7位

double:1bit(符号位) 11bits(指数位) 52bits(尾数位)

最高位是符号位:1代表负数,0代表正数
指数位:-210~210-1 -1024~1023
有效数位(尾数位):2^52 4503599627370496 16位

选择使用

根据自己的需求:float(4字节,6精度)、double(8字节,最少10精度,一般都是实现15精度) 常用,long double一般用的不是很多,因为我们不需要那么高的精度。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐