浮點格式IEEE754詳解


  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處理器的浮點表示法

  具體見下圖

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM