对java中的浮点数表示的理解
来源:互联网 发布:linux就该这么学pdf 编辑:程序博客网 时间:2024/04/30 20:31
浮点数 分为三部分表示,一是符号sign,用s表示,二是指数e,三是底数m。
对于一个32bit的数字,
第31位代表s位,第30-23位代表e,后面第22-0位代表m。
×××× ×××× × ××× ×××× ×××× ×××× ×××× ××××
IEEE754的规定如下:
int e = ((bits >> 23) & 0xff);
int m = (e == 0) ?
(bits & 0x7fffff) << 1 :
(bits & 0x7fffff) | 0x800000;
我将其用我的语言表达一下:
int s=第31位为0?正数:负数;
int e=第30-23位数字表达成十进制数-127(单精度(float)型的幂用加上127后用8位二进制数表示);
float m=(e!=0)?(1+(第22-第0位的二进制数表达为十进制数×2^(-23)):
(第22-第0位的二进制数表达为十进制数×2^(-23)<<1):
问题1:当e!=0时,为什么要在m前面+1呢?实际上就是后23位前加入了“1.”,为了使得不同的二进制序列表达不同的意思,充分利用各个数字。则我们可能认为在后23位前加入了“0.”。
如果不加1,则0 000 0001 0 001 0000 0000 0000 0000 0000 表示(2^ -3)×2^2×2^(-127);
和0 000 0001 1 010 0000 0000 0000 0000 0000 :(2^ -2)×2^3 ×2^(-127);表达同一个数字,
两个编码表达同一个数字,这就是浪费,为了避免浪费,就在前面+1,这样
0 000 0001 0 001 0000 0000 0000 0000 0000 表示(1+2^ -3)×2^2×2^(-127);;
和0 000 0001 1 010 0000 0000 0000 0000 0000 表示(1+2^ -2)×2^3×2^(-127);
于是,这两个编码所表达的数字就不一样了。
问题二:当e=0时,为什么前面不加“1.”了呢?如果前面还+1,那最小的正数就变成
0 000 0000 0 000 0000 0000 0000 0000 0000:为1×2^(-127);感觉精度还不够精细,
另外,那样的话,0就没法表示了。所以,这个时候前面不加“1.”而加“0.”
问题三:当e=0时,前面加“0.”,这时计算m的时候为什么要左移一位呢?
这个个人认为是数字表达的连续,如果不左移一位,那我们在
0000 0000 0111 1111 1111 1111 1111 1111 不左移的话,表示为0.111……(23个1)×2^(-127)
0000 0000 1000 0000 0000 0000 0000 0000 表达数字1×2^1×2^(-127)之间有缺口,处于这两个浮点数之间的浮点数无法用二进制编码表示。为了填补这个缺口,我们宁可牺牲点精度。于是按照IEEE754约定
0000 0000 0111 1111 1111 1111 1111 1111 表达浮点数1.111……(22个1,最后一个编码为0)×2^(127);
与1×2^1×2^(-127)之间的差为2^(-23)×2^1×2^(-127),这个就是浮点数的精度
2×2^(-150),也是能表达的最小的浮点数:0000 0000 0000 0000 0000 0000 0000 0001。
于是,按照IEEE754那样表达浮点数,从理论上来说相对比较完善了。
希望大家看完之后,能受到点启发,加深对浮点数表示的理解。IEEE754是一个标准,制定标准的人自然考虑比较周全,他们那么表示自然有他们的理由,希望我的理解对了。
- 对java中的浮点数表示的理解
- Java中浮点数的正确表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数的表示
- 浮点数在内存中的表示移位存储难点的理解
- 计算机中的浮点数表示
- 【深入理解计算机系统】【浮点数的表示范围】
- 尚未结束的眼球经济时代
- Prison Break
- Web开发必看(二)-----37个网页常用javascript
- Access数据库“自动编号”字段归零
- 以无法为有法 以无限为有限
- 对java中的浮点数表示的理解
- 李小龙关于截拳道的语录精选
- Java编程思想读书笔记
- struts in action读书笔记
- 昔日利刃---ICESWORD也不太行了啵
- 将Java包程序转换为Exe可执行文件
- 汇编与C....
- ASP.NET+C# 2.0 建站日记(一) C#类的共享
- 页间变量的传递讨论