float,double分别遵循R32-24,R64-53的标准,
他们的比特位数分别是23,52,
即误差在2-23 ,2-52;
所以float的10进制精度误差在1e-6,double的10进制精度误差在1e-15 。
所以要判断一个单精度浮点数:则是
if( fabs(f_float) <= 1e-6);
要判断一个双精度浮点数:则是
if( fabs(d_double) <= 1e-15 );
判断两个浮点数相等:
if( fabs(a_float-b_float) <= 1e-6);
if( fabs(x_double-y_double) <= 1e-15);
浮点数表达的有效位数(也就是俗称的精度)和表达范围不是一个意思
经常说什么单精度一般小数点精度是7-8位,双精度是15-16位,到低怎么来的呢?前面说了,单精度数尾数23位,加上默认的小数点前的1位1,2(23+1) = 16777216。关键: 107 < 16777216 < 108,所以说单精度浮点数的有效位数是7-8位,这个7-8位说的是十进制下的,而我们前面说的尾数位数那是二进制下的,需要转换。
又看,双精度的尾数52位存储,2(52+1) = 9007199254740992,那么有1016 < 9007199254740992 < 1017,所以双精度的有效位数是16-17位。
补充:abs与fabs区别
abs 返回整形数据的绝对值。
头文件:#include<math.h>
用 法: int abs(int i);
fabs 返回浮点数据的绝对值。
头文件:#include <math.h>
用法:float fabs(float x);