鱼C论坛

 找回密码
 立即注册
查看: 2071|回复: 9

浮点数的问题~

[复制链接]
发表于 2014-3-7 19:27:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mack1983 于 2014-3-8 00:55 编辑

1.jpg
如图,a=123456.789e5
a=12345678848.000000

        a=12345678848
2^32=4294967296

问题一:
float浮点型数值占用4个节字,能存的最大值才是4294967296
而a的值都明显大于 2^32的值了,这还叫float浮点型数值占用4个节字吗?

问题二:
再说,4个字节有符号数的取值范围是-2147483647至2147483645
a=123456.789e5=12345678848.000000
也不应该是在第八位溢出啊,最起码也应该在第10位溢出啊~

问题三:
视频里说,有效位32的为前8位,那就更无法理解了,长上符号位只有8位有效位,
2^8=256
就连123456.789这什值都存不了,更别说123456.789e5能存这个数了~

求各位大虾答疑啊~~



追问:
我有点明白了
一共是32位
第1位存指数符号
2至8这7个位存指数是多少,7位取值范围是:2^7=128,也就是:  -128 ~ 127
第9位,存底数符号
10-32这23位存低数,23位的取值范围是:2^23=8388608,也就是:  -8388608 ~ 8388607

请问我这样理解正确么?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-7 19:52:46 | 显示全部楼层
这个问题略微复杂,这样吧简单一点,百度 IEEE 754标准。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 20:54:51 | 显示全部楼层
浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。

一个浮点数由2部分组成:底数m 和 指数e。
  ±mantissa × 2exponent
(注意,公式中的mantissa 和 exponent使用二进制表示)
底数部分 使用2进制数来表示此浮点数的实际值。
指数部分 占用8-bit的二进制数,可表示数值范围为0-255。

但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128.

底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。

到目前为止, 底数部分 23位 加上指数部分 8位 使用了31位。那么前面说过,float是占用4个字节即32-bit,那么还有一位是干嘛用的呢? 还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。

浮点数据就是按下表的格式存储在4个字节中:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S: 表示浮点数正负
E: 指数加上127后的值的二进制数
M: 24-bit的底数(只存储23-bit)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 21:01:29 | 显示全部楼层
楼上的多少看懂了点,不过以后还得看,收藏先
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 21:36:37 | 显示全部楼层
这是我个人的一些见解!
这道题分析的应该是舍入误差,首先a是属于double,程序现在要求输入的是float,肯定会有精度的损失
float在内存中占4个字节32位,符号位+7位有效数字+指数符号+指数,因此输出的数据只能保证前7位!
其实这里边还有十进制,二进制转化的问题,有的除不尽,有的除尽,比如4/2,和1/3一样,会有误差!
float数据 机器内2进制数
1位符号位
8位指数位
23位尾数位
共32 位 2进制数
平时讲 有效数字 6~7位 指10进制

通常程序输入数10进制进入机器要化成2进制计算完又转十进制输出
10进制2进制2进制10进制 转换有数化净有数化得净
同10进制分数化10进制小数有化得净(例 4分之1变0.25)有化净(例 3分之1变0.33333....)

10进制2进制2进制10进制 转换化得净效数字7位化净效数字6位因位有舍入误差
例:
float x,y;
x=0.51;  // 化净
y=0.5;   // 化得净
printf("x=%.8f y=%.8",x,y);  //  输出 0.50999999 0.50000000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 21:44:18 | 显示全部楼层

解释的太好了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-7 23:38:40 | 显示全部楼层
一生为你画眉 发表于 2014-3-7 21:36
这是我个人的一些见解!
这道题分析的应该是舍入误差,首先a是属于double,程序现在要求输入的是float,肯 ...

谢谢,其实我的问题跟误差没什么关系~~~
先抛开误差不说
float a;
a=123456.789e5
打印输出a的值=12345678848

浮点数是四个字节,可存的最大值为4294967296
那么请问,12345678848比4294967296,请问四字节的空间怎么存?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 00:24:15 | 显示全部楼层
good~~~~!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 00:51:27 | 显示全部楼层
zheyitian 发表于 2014-3-7 20:54
浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。

一个浮点数由2部分组成: ...

我有点明白了
一共是32位
第1位存指数符号
2至8这7个位存指数是多少,7位取值范围是:2^7=128,也就是:  -128 ~ 127
第9位,存底数符号
10-32这23位存低数,23位的取值范围是:2^23=8388608,也就是:  -8388608 ~ 8388607

请问我这样理解正确么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 21:27:12 | 显示全部楼层
mack1983 发表于 2014-3-7 23:38
谢谢,其实我的问题跟误差没什么关系~~~
先抛开误差不说
float a;

我也是初学者,,以后可以多交流!
这个问题,按照小甲鱼的视频应该是32位第一位是 a的符号位,然后的7位存12345657,接下来一位存指数的符号!剩下的23为存指数!
我的一些心得感觉假如现在这个问题搞不懂,记下来,接着往下去看视频,等学习会之后再回来研究这个问题!
另外也不必纠结float,一般都是会用double,计算中都会直接转换成double的!
不知道对你有没有用!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-7 07:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表