float 为什么可以表示很大的整数

#include<stdio.h>main(){floatterm=1,sum=0;inti;for(i=1;i<=20;i++){term=term*i;sum=sum... #include<stdio.h>
main()
{
float term = 1,sum = 0;
int i;

for (i = 1; i <= 20; i++)
{
term= term * i;
sum= sum + term;
}

printf("1!+2!+...+20! = %f\n", sum);
}
可以输出来很长的数,为什么long没有float输出的多呢?
展开
 我来答
听不清啊
高粉答主

推荐于2017-09-15 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部

这个数据已经失真了。我们知道,1!=1    2!=2     3!=6    4!=24    5!=120    6!=720   ……

以后每个数的阶乘其末尾个位数肯定是0,所以,1!+2!+...+20! 的个位数肯定是1+2=3。

所以,上面程序计算得出的数肯定是不对的了。这是由于不同的类型所能表示数的范围和精度所决定的:

long最大能表示到21亿多,而实型数的情况如下:

  1. 范围
      float和double的范围是由指数的位数来决定的。
      float的指数位有8位,而double的指数位有11位,分布如下:
      float:
      1bit(符号位) 8bits(指数位) 23bits(尾数位)
      double:
      1bit(符号位) 11bits(指数位) 52bits(尾数位)
      于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
      其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
      float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

2.  精度
  float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
  float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
  double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

百度网友96ffcf7
推荐于2017-10-07 · 知道合伙人互联网行家
百度网友96ffcf7
知道合伙人互联网行家
采纳数:22721 获赞数:118725
从事多年网络方面工作,有丰富的互联网经验。

向TA提问 私信TA
展开全部
  1、float型:单精度浮点数在机内占4个字节,用32位二进制描述(注意:计算机中1个字节=8位).
  2、浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分.
  3、可以算出float型变量所表示的数范围了:2^(-32)到2^32-1,大约是±3.4E38
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式