float类型的精度究竟是多少

zjtzlqr 杭州海康威视科技股份有限公司 软件开发工程师  2013-02-19 02:34:33
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
...全文
3242 16 点赞 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵4老师 2013-02-22
引用 15 楼 zhao4zhong1 的回复:
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。
综上所述,用二进制小数表示某些十进制小数不可能没有误差!
  • 打赏
  • 举报
回复
赵4老师 2013-02-22
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。
  • 打赏
  • 举报
回复
zjtzlqr 2013-02-21
我搞错了,其实是2的24次方-1
  • 打赏
  • 举报
回复
lin5161678 2013-02-21
你的第一位肯定是1的结论是怎么得出来 好诡异 23位 就是23位啊 16777215
  • 打赏
  • 举报
回复
zjtzlqr 2013-02-21
有效位为23位,但是第一位肯定是1,所以有效位为24位,如果24位全部为1那么可以显示的最大数字是33554431,但是为什么实际上给float a赋值33554431时却会发生错误
  • 打赏
  • 举报
回复
booksyhay 2013-02-21
我以前专门研究过浮点数的精度。 IEEE754中规定,浮点数的尾数占用23位,加上最前面隐含的一位,有效精度确实是24位, 也就是说,最大可表示2^24 - 1 而不会有误差。 注意,是2^24 - 1,而不是2^25 - 1
  • 打赏
  • 举报
回复
赵4老师 2013-02-21
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
  • 打赏
  • 举报
回复
赵4老师 2013-02-20
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 */
...
  • 打赏
  • 举报
回复
iamnobody 2013-02-20
http://en.cppreference.com/w/cpp/language/types
  • 打赏
  • 举报
回复
rockets311 2013-02-20
IEEE754标准
  • 打赏
  • 举报
回复
nadleeh 2013-02-20
引用 5 楼 rocktyt2 的回复:
位数只有23位,没法保存25位精度的大哥
float我没记错的话最多精确到小数点后6位还是7位,而且float本身精确度就很差。内存中你都知道了是整数,而且就那么多位,你又想那么精确,可能么。
  • 打赏
  • 举报
回复
rocktyt 2013-02-19
位数只有23位,没法保存25位精度的大哥
  • 打赏
  • 举报
回复
zjtzlqr 2013-02-19
引用 3 楼 nadleeh123 的回复:
引用 楼主 zjtzlqr 的回复:float类型是32位的 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 尾数部分(Mantissa):尾数部分 其中指数位为8位,符号位为1位,尾数位为23位。 科学计数法存储的float类型第一位肯定是1,因此有效的位数为24位。 2的25次……
研究过的,不然我怎么知道是33554431
  • 打赏
  • 举报
回复
nadleeh 2013-02-19
引用 楼主 zjtzlqr 的回复:
float类型是32位的 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 尾数部分(Mantissa):尾数部分 其中指数位为8位,符号位为1位,尾数位为23位。 科学计数法存储的float类型第一位肯定是1,因此有效的位数为24位。 2的25次方-1为33554431; 也就是……
你为什么要研究精度,而不研究你口中的浮点数在内存里面到底长什么样?
  • 打赏
  • 举报
回复
FancyMouse 2013-02-19
那是输出的时候产生的误差。你用a减去33554431得出来是0。
  • 打赏
  • 举报
回复
zjtzlqr 2013-02-19
有没有人了解这方面的知识
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2013-02-19 02:34
社区公告
暂无公告