请教前辈关于float变量的比较问题
小弟想知道float变量的比较怎么进行,在网上查了==需要用 a - b < eps && b - a < eps (eps是精度),小弟想知道>=, >, <= , < 的比较该怎么进行, 是否可以直接使用?
谢谢大家。
[解决办法]
float x与“零值”比较的if语句:
标准答案: 错误的写法:
const float EPSION = 0.00001 if(x = 0.0)
if((x >= -EPSION) && (x <= EPSION)) if(x != 0.0)
[解决办法]
关于浮点数的精度问题,太多似是而非的东西了,实际浮点数的误差有误差的最根本原因就是计算导致的,比如float x=0.6f;
float y=x/30;//这时候y可能不等于0.02,因为计算误差,所以直接比较会不正确,实际这个时候大于和小于一样有可能不正确,就像这个时候你判断y>0.02,返回值是true
[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
float.h
...
#define DBL_DIG 15 /* # of decimal digits of precision */
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG 53 /* # of bits in mantissa */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP 308 /* max decimal exponent */
#define DBL_MAX_EXP 1024 /* max binary exponent */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
#define DBL_MIN_EXP (-1021) /* min binary exponent */
#define _DBL_RADIX 2 /* exponent radix */
#define _DBL_ROUNDS 1 /* addition rounding: near */
#define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD 0
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MAX_10_EXP 38 /* max decimal exponent */
#define FLT_MAX_EXP 128 /* max binary exponent */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
#define FLT_MIN_EXP (-125) /* min binary exponent */
#define FLT_NORMALIZE 0
#define FLT_RADIX 2 /* exponent radix */
#define FLT_ROUNDS 1 /* addition rounding: near */
...