C语言浮点数标准
计算机中浮点数采用的是IEEE 754标准。浮点数分为单精度浮点数(32位)和双精度浮点数(64位)。浮点数的基本格式如下:
sign:符号位,0表示正,1表示负
exponent:阶码,浮点数的幂次。一般采用移码表示。
fraction:浮点数的小数部分
C语言float,double数据结构
以float为例
二进制小数十进制小数
2^-230.00000011920928955078125
2^-220.0000002384185791015625
2^-210.000000476837158203125
2^-200.00000095367431640625
2^-190.0000019073486328125
2^-180.000003814697265625
float的精度由尾数决定。2^23=8 388 608 有7位。是不是说明精度应该是7位?实际上float的二进制向十进制转换过程中不是一一对应的。是离散的。float最小的数是0.00000011920928955078125。
#include
int main(){
float f1=1.0000011f;
float f2=1.0000022f;
float f3=1.0000033f;
float f4=1.0000044f;
float f5=1.0000055f;
float f6=1.0000066f;
float f7=1.0000077f;
float f8=1.0000088f;
float f9=1.0000099f;
printf("%.7f %.25fn",f1,f1);
printf("%.7f %.25fn",f2,f2);
printf("%.7f %.25fn",f3,f3);
printf("%.7f %.25fn",f4,f4);
printf("%.7f %.25fn",f5,f5);
printf("%.7f %.25fn",f6,f6);
printf("%.7f %.25fn",f7,f7);
printf("%.7f %.25fn",f8,f8);
printf("%.7f %.25fn",f9,f9);
return 0;
}
输出>>
1.0000011 1.0000010728836060000000000
1.0000021 1.0000021457672119000000000
1.0000033 1.0000033378601074000000000
1.0000044 1.0000044107437134000000000
1.0000055 1.0000054836273193000000000
1.0000066 1.0000065565109253000000000
1.0000077 1.0000077486038208000000000
1.0000088 1.0000088214874268000000000
1.0000099 1.0000098943710327000000000
输出结果中可以得出: 小数点后第6位是准确的,但是到了第7位,某些数字发生的四舍五入。
1.0000066 1.0000065565109253000000000 1.0000099 1.0000098943710327000000000 都发生了四舍五入。所以说第7位有可能精确,也有可能不精确。