float类型的精度究竟是多少
float类型是32位的
符号位(Sign) : 0代表正,1代表为负
指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分(Mantissa):尾数部分
其中指数位为8位,符号位为1位,尾数位为23位。
科学计数法存储的float类型第一位肯定是1,因此有效的位数为24位。
2的25次方-1为33554431;
也就是说其实float存储的数据如果是整数的话那么存储精度范围为0-33554431;
但是为什么
#include "stdio.h"
int main(void)
{
float a;
a=33554431;
}
这个程序在调试的时候,明明给a赋的值是33554431,可是编译器显示的数据确实a的值为33554432
------解决方案--------------------
float.h
...
#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 */
...
------解决方案--------------------
我以前专门研究过浮点数的精度。
IEEE754中规定,浮点数的尾数占用23位,加上最前面隐含的一位,有效精度确实是24位,
也就是说,最大可表示2^24 - 1 而不会有误差。
注意,是2^24 - 1,而不是2^25 - 1