c语言中浮点数精度陷阱
程序员文章站
2022-03-30 17:46:38
...
浮点数在计算机中采用数符+阶码+尾数表示。
主要有以下几个需要注意的点:
1.float型 有效数字为6-7位,
double型 有效数字为15-16位。
2.浮点数间比较大小不能通过==运算符比较。因为在机器中小数采用近似值表示。
需要通过减法去比较。如
float f1 = 4.56;
if(abs(f1-4.56)<1e-6){
printf("f1 is equal to 4.56");
}
3.在内存中存放方式(大端,小端)
https://baike.baidu.com/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fr=aladdin
阶码实际值 为 数值-127, 以2为底。
4.数据转换:
在整数除法中,由于整数除法会丢失小数。
int a = 5;
int b = 2;
float f = a / b;
printf("%f\n",f);
输出为2.0 。这里是因为前面 a/b 已经造成了数据丢失,才赋值给float。所以没有输出2.5 。
需要对a或b进行强制类型转换成float或者double才可以。
float f = (float)a / b;
printf("%f", f);
此时输出为2.5 。