首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

float部类的精度究竟是多少

2013-02-27 
float类型的精度究竟是多少float类型是32位的符号位(Sign) : 0代表正,1代表为负指数位(Exponent):用于存储

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

热点排行