| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4961 人关注过本帖
标题:c float 范围是 -3.4*10^-38~3.4*10^38还是是-3.4*10^38~3.4*10^38
只看楼主 加入收藏
蓝梅
Rank: 2
等 级:论坛游民
帖 子:23
专家分:19
注 册:2010-9-6
结帖率:16.67%
收藏
 问题点数:0 回复次数:8 
c float 范围是 -3.4*10^-38~3.4*10^38还是是-3.4*10^38~3.4*10^38
c float 范围是 -3.4*10^-38~3.4*10^38还是是-3.4*10^38~3.4*10^38
搜索更多相关主题的帖子: float 范围 
2010-09-06 18:45
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:0 
-3.4*10(-38)~3.4*10(38) double 64 15-16 -1.7*10(-308)~1.7*10(308) long double 128 18-19 -1.2*10(-4932)~1.2*10(4932)

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2010-09-06 19:34
蓝梅
Rank: 2
等 级:论坛游民
帖 子:23
专家分:19
注 册:2010-9-6
收藏
得分:0 
应该是-3.4*10^38~3.4*10^38
谭浩强 c程序设计第三版  上是3.4*10^-38~3.4*10^38,我觉得老谭写错了
2010-09-06 19:58
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:0 
C语言规定了 FLOAT 类型,6~7位的有效数字,取值 范围 -3.4e-38至3.4e38。

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2010-09-06 20:25
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
现在,一般都是采用的IEEE 754标准。float类型的数占32位。对于一个浮点数可以分解成3个部分(符号,指数,尾数),为了书写简便,下面对于这3部分我分别用s,e,f来表示。浮点数从最高位到最低位是这样表示的s(1位),e(8位),f(23位) .浮点数大小是(-1)^s  *  2^(e-127) * 1.f
在IEEE 745标准中:
  1。符号位s,如果是0则为正;否则是1则为负.
  2。指数e有一个偏移量127,所以实际指数还要减去127。如果指数部分位1000 0000(10进制数128),那么实际指数应该是1(128-127)。
  3。最后面的23位全部为尾数,即2进制中的小数部分。

下面在说一下它的一些要注意的地方:
  1。IEEE 745标准中式严格区分正0和负0的,不过一般的C库是不区分的。不是经常有人说要判断浮点数f是不是0,要这样 (f < 10^-6) && (f> -10^6),那是因为0也有正负。但实际中并不要这样,基本上所有的C库都是不分正负0的,很多人对IEEE的区分正负0都感到质疑。
  2。通常的C库中的0的表示是:32位全部是0。
  3。如果e最大(8位全部为1),此时e=255,它应该实际表示的指数是255-127=128.不过在这个标准中它有其他的意义:
     3.1 e=255,f=0(f的23位全部为0),此时表示的是INF,是正无穷大还是负无穷大由符号位s决定。
     3.2 e=255, f!=0(f的23位不全部为0),此时表示的是NaN。IEEE 标准中的NaN是有两类,一类是和算术有关,一类是和信号有关。不过通常的C库不区分的。
  4。如果e最小(8位全部为0),此时e=0,它应该实际表示的指数是0-127=-127,标准中规定了这不是一个规范的浮点数,但它也是合法的(只是整数部分为0)。

从上面4点我们可以知道(只考虑正数,负数只是关于0对称),
      最大的实际指数是127(128有其他意义),所以最大的一个float数Fmax=1.111... * 2^127  其中1.111...小数部分有23个1,表示的是一2进制数
      最小的实际指数是-126(-127并不规范),所以最小的一个float数Fmin=1.000... * 2^-126。 其中1.000...小数部分有23个0,表示的是一2进制数

由此float数的表示范围是 [-Fmax , -Fmin] 0[Fmin , Fmax].
把其中的Fmax化成10进制数是 127 * lg 2 (差不多就是 3.4*10^38)
对于float数的精度(也就是小数点后面的位数)应该是:lg ( 2^23) = 23 * lg 2(差不多就是7)【应为float数尾数有23位】。



[ 本帖最后由 Windy0Winll 于 2010-9-7 20:56 编辑 ]

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-07 20:39
蓝梅
Rank: 2
等 级:论坛游民
帖 子:23
专家分:19
注 册:2010-9-6
收藏
得分:0 
对于float数的精度(也就是小数点后面的位数)应该是:lg ( 2^24) = 24 * lg 2(差不多就是7.2)【因为float数尾数有23位,还有一位默认1】。
谭浩强教材上,精度有效位是6~7位,6是如何得出的?
2010-09-10 17:55
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
----lg ( 2^24) = 24 * lg 2(差不多就是7.2)----
我还是觉得不是24,是23.

所谓的精度,应该是精确到小数点后面几位,当然不能算整数部分了.而您所说的省略的那个1可是整数部分哦,您也说了尾数只有23位么?
因此我还是认为所谓精度是这样计算的:lg ( 2^23) = 23 * lg 2(差不多就是6.92),通常我们说float数的精度是6~7.

再者,10进制和2进制还是有差别的,10进制中是有限小数可能在2进制中是无限循环小数.因此只有象这样的小数才能真正表示为2进制小数:1.5,1.75,0.25,0.625...
即使是6位以内的小数,绝大部分数也是不能真正表示为2进制小数的.
一般情况,浮点数的效率很低(定点数可能要比它高效几十倍到几百倍,尤其在乘除法运算),还有它在精度上要比定点数低些.要不是在确实有必要的情况下,绝对不要用浮点数来代替定点数.

希望对您有帮助.:)

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-10 18:45
a3192048
Rank: 1
等 级:新手上路
威 望:1
帖 子:3
专家分:0
注 册:2014-4-1
收藏
得分:0 
应该是谭浩强错了,根据IEEE754,浮点型取值范围:

单精度:[-3.4*10^38, -1.18*10^-38] U [1.18*10^-38, 3.4*10^38]

双精度:[-1.80*10^308, -2.23*10^-308] U [2.23*10^-308, 1.80*10^308]
2020-06-12 19:41
a3192048
Rank: 1
等 级:新手上路
威 望:1
帖 子:3
专家分:0
注 册:2014-4-1
收藏
得分:0 
参考下:https://blog.
2020-06-12 19:42
快速回复:c float 范围是 -3.4*10^-38~3.4*10^38还是是-3.4*10^38~3.4*10^38
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.095936 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved