c语言中浮点数精度陷阱

浮点数在计算机中采用数符+阶码+尾数表示。

主要有以下几个需要注意的点:

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 。

猜你喜欢

转载自blog.csdn.net/birdunderastarrysky/article/details/89707164