1,指数E的存储为什么要加127,比如说某个浮点数转换为二进制后为1000.01=1.00001*10^3,直接存3不就完事了吗?干嘛还要 3+127=130再存进去,看了某篇文章说是移位存储,我查了下也没搞清楚是怎么回事,知道的请说说
2,浮点数不是规定E=0,F=0,即指数和尾数全为零时就表示0吗?那为什么float X与0比较还要用限定范围的那种方式,而不是直接if(x==0),因为我觉得你既然规定了0可以确切的被表示出来,那就可以用这种确定的比较方式,对吗?
3,我看到有人说这样一句话,float的精度为7位,但是绝对能保证的只有6位,不是很明白,望指教
4,对于确切两个浮点数 a+b 和 b+a 永远是等的,但是 (a+b)+c 和 (a+c)+b 就不一定了,为何??????
C语言中的float存储问题,请尽量详细解答,谢谢
答案:3 悬赏:70 手机版
解决时间 2021-03-03 07:10
- 提问者网友:原来太熟悉了会陌生
- 2021-03-02 14:02
最佳答案
- 五星知识达人网友:掌灯师
- 2021-03-02 15:41
1:假设那个3是-3,你存储负数时必须在首位一般要加一个符号,那么二进制-3=1000 0011,而1000 0011=131,电脑就会出错。所以电脑一般采用的是浮点数的补码进行运算,至于补码你可以看微机原理与接口技术。
2:不理解你的问题
3:举个例子八位小数0.1234567x,如果x<5时就是0.1234567,当x》5时就是0.1234568了,所以第七位不能保证。
4:如果你运算的是a+b+c和a+c+b那就会相等,而加了括号后优先级变化了,系统会先把括号里的计算结果处理保存起来在和括号外边的运算,这样由于精度问题就会有误差。
2:不理解你的问题
3:举个例子八位小数0.1234567x,如果x<5时就是0.1234567,当x》5时就是0.1234568了,所以第七位不能保证。
4:如果你运算的是a+b+c和a+c+b那就会相等,而加了括号后优先级变化了,系统会先把括号里的计算结果处理保存起来在和括号外边的运算,这样由于精度问题就会有误差。
全部回答
- 1楼网友:山君与见山
- 2021-03-02 17:38
float存储方式是由ieee来规定的
存储分为三个部分:
符号位(sign) : 0代表正,1代表为负 ---------1位
指数位(exponent):用于存储科学计数法中的指数数据,并且采用移位存储 --------8位
尾数部分(mantissa):尾数部分 ----------23位
ieee规定:
指数偏移值是指浮点数表示法中的指数域的编码值为指数的实际值加上某个固定的值,该固定值为 2e-1 - 1,其中的e为存储指数的位元的长度。
以单精度浮点数为例,它的指数域是8个位元,固定偏移值是2^(8-1) - 1 = 128−1 = 127. 单精度浮点数的指数部分实际取值是从128到-127。例如指数实际值为1710,在单精度浮点数中的指数域编码值为144, 即144 = 17 + 127.
科学计数法的表示为1.xxx*(2^n),尾数部分就可以表示为xxx,第一位都是1,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit。而十进制里面每一位是用二进制的4位来表示的,所以24bit的精确度就是24/4 = 6 :)
一个规格化的单精度浮点数x的真值为x=((-1)^s)*(1.m)*(2^(e-127))
对于计算机中32bit表示的浮点数,表示的术的绝对值的范围约为(1e-38)~(1e+38),即2^(-127)~1.
- 2楼网友:往事埋风中
- 2021-03-02 17:06
这个你不用搞懂 这个叫偏移码 就是为了电脑方便计算 统一位数 就是加上一个2^n,这个n代表一个字节的位数 因为计算机都是二进制的 而且寄存器都是八位 所以都加上2的8次方
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯