zoukankan      html  css  js  c++  java
  • 【转】浮点格式IEEE754详解

    原文网址:http://www.cnblogs.com/zjujunge/archive/2012/09/13/2682613.html

    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处理器的浮点表示法

      具体见下图

  • 相关阅读:
    Python学习4
    Python学习3
    Python学习2
    表空间
    sqlplus常用设置
    HashMap和LinkedHashMap
    堆栈源码
    观察者模式
    策略模式
    java线性表
  • 原文地址:https://www.cnblogs.com/wi100sh/p/5048479.html
Copyright © 2011-2022 走看看