代码改变世界

浮点格式IEEE754详解

2012-09-13 11:08  neu_zjujunge  阅读(15398)  评论(4编辑  收藏  举报

  Intel聘请了最好的数值分析家来为8087FPU设计浮点数格式,他们设计的KCS浮点数标准的工作是如此出色,因此IEEE将这种格式作为IEEE浮点数格式的基础。

  为了满足广泛的性能与精度需求,intel实际实现三种浮点格式:单精度、双精度以及扩展精度,本文以前两种讲解。

  1. 单精度浮点格式

  单精度使用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处理器的浮点表示法

  具体见下图