浮点格式IEEE754详解
2012-09-13 11:08 neu_zjujunge 阅读(15775) 评论(4) 编辑 收藏 举报Intel聘请了最好的数值分析家来为8087FPU设计浮点数格式,他们设计的KCS浮点数标准的工作是如此出色,因此IEEE将这种格式作为IEEE浮点数格式的基础。
为了满足广泛的性能与精度需求,intel实际实现三种浮点格式:单精度、双精度以及扩展精度,本文以前两种讲解。
- 单精度浮点格式
单精度使用24位的尾数与8位的阶码,尾数通常表示的值在(1.0,2.0),尾数的最高为总是假定为1,正好是在二进制二进制小数点左边的第一个位,余下的23个尾数位则在小数点右边,代表该数。具体见下图M为尾数位。
隐含位的存在导致尾数总是大于或等于1,小数点右边的每个位代表一个值(0或1)乘以2一个负幂。尽管从1到2有无限个数,我们能够表示的只有八百万个(223)。
尾数使用1补码格式二不是2的补码。第31位(S)符号决定正负。
阶码使用余-127格式简化了浮点数的比较。
2.双精度浮点
参照单精度浮点解析以及上图即可明白。
3.浮点转成二进制显示部分源代码(C#)
单精度浮点数显示
private void fp_Disp(double number) { double zhenshu, xiaoshu, jieguo; string strZ, strX = "", strJ = ""; Int64 numb = 127; int i = 1, len, le, len2, len3, Bias = 127; string s = "", str1, str2, Jiema = "", weishu = "", jia;//,ti_Jiema=""; if (number > 0) { s = "0"; } else { s = "1"; } zhenshu = Math.Floor(Math.Abs(number)); //整数部分 numb = Convert.ToInt64(zhenshu); strZ = Convert.ToString(numb, 2); xiaoshu = Math.Abs(number) - zhenshu; for (i = 0; ((xiaoshu != 0) && (i < 23)); i++) { jieguo = xiaoshu * 2; strJ = jieguo.ToString(); strX += strJ.Substring(0, 1); zhenshu = Math.Floor(jieguo); xiaoshu = jieguo - zhenshu; } strJ = strZ + "." + strX; str1 = strJ.Substring(0, 1); if (str1.Equals("1")) { len = strZ.Length; le = len + Bias - 1; Jiema = Convert.ToString(le, 2); len2 = Jiema.Length; if (len2 < 8) { for (i = 0, jia = ""; i < 8 - len2; i++) { jia += "0"; } Jiema = jia + Jiema; } str2 = strZ.Substring(1, len - 1) + strX; len = str2.Length; if (len > 23) { weishu = str2.Substring(0, 23); } else { weishu = str2; } } else { len = strX.IndexOf("1"); le = Bias - (len + 1); Jiema = Convert.ToString(le, 2); len2 = Jiema.Length; if (len2 < 8) { for (i = 0, jia = ""; i < 8 - len2; i++) { jia += "0"; } Jiema = jia + Jiema; } len3 = strX.Length; if (len3 == (len + 1)) { weishu = "0"; } else { weishu = strX.Substring(len + 1); } } strJ = s + Jiema + weishu; len = strJ.Length; if (len < 32) { for (i = 0; i < 32 - len; i++) { strJ += "0"; } } fp_sBox.Text = s; fp_eBox.Text = Jiema; len = 23 - weishu.Length; for (i = 0; i < len; i++) weishu += "0"; fp_mBox.Text = weishu; byte fe; fe = Convert.ToByte(Jiema, 2); fp_eBox1.Text = fe.ToString(); fp_eBox2.Text = (fe - Bias).ToString(); //ti处理 ti_sBox.Text = s; ti_eBox2.Text = (fe - Bias).ToString(); ti_eBox1.Text = (fe + 1).ToString(); Jiema = Convert.ToString(fe + 1, 2); len=Jiema.Length; for (i = 0; i < 8 - len; i++) { Jiema = "0" + Jiema; } ti_eBox.Text = Jiema; ti_mBox.Text = weishu; dti_eBox.Text = Jiema; }
4.TI处理器的浮点表示法
具体见下图