<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 概述 Double遵循IEEE754算數標準 Double遵循此標準中的64位浮點數表示方式。從左到右具體為: * 第一位為符號部,0表示正,1表示負 * 2~12位為指數部,用以存放具體數值的指數 * 13~64位為尾數部 其中指數部為11位,可以表示2048個數,為-1023~+1024,因為存在正負號,會導致運算比較困難,故標準中設置了一個偏移值,將指數加上偏移值后得到編碼值存儲在指數部中,利于計算和比較。其中偏移值為2^(x-1)-1,x為指數部的位數,此處為11,故偏移值為1023.得到的編碼值范圍為0~2047(其中0(11位全是0)和2047(11位全是1)為特殊情況,下面會提到). **規約數:**規約數是指數的編碼值(假設為Q),0&lt;Q&lt;2047時,所表示的數,此時尾數的個位將自動補全1.例如,十進制下的15用double存儲時,可以分以下幾步理解: 1.先將15化為2進制,為1111 2.將1111轉化為二進制下的指數形式,為1.111\* 2^3,故用double存儲時,指數為3,加上偏移值后的指數部存儲編碼值為1026,尾數部為111(小數點前的1自動補全) 3.double中的值為0100 0000 0010 1110(后面還有48個0) 但光用規約數也會產生問題,例如,只用規約數的話正數最小值為1.0\* 2^-1022,這會帶來很大麻煩,如1.2\*2^\(-1022\)-1.1\*2^\(-1022\)即0.1\*2^\(-1022\)將用Double表示時將為0,值得連續性也會在此處發生斷崖式下降(大于1.0\* 2^-1022的數,連續性為2^(-1074)),0也無法表示。故需要引入非規約數。 **非規約數**:指數部的編碼值為0,且尾數部不全為0,此時尾數部的整數位將自動補全0. 當一個數為非規約數時,指數編碼值為0,實際指數為-1022(沒錯,是-1022,不是-1023,需要加1,就是這么規定的),此時,double的連續性將處處相等,都為2^\(-1074\),并且任何兩個double的和差都能用唯一的double值表示。 當指數部編碼值為0,尾數部也為0時,double值為0,固0可以有兩種表達方式(+0和-0) 當指數部編碼為2047,尾部全為0時,表示無窮,尾部不是全為0時,表示NaN 此種設計下的double值比較十分方便,首先比較符號位,為0的一定大于為1的\(正數大于負數\),若相等,再比較指數位,因為存的編碼值都為正數,所以編碼值大的數一定大\(符號位為0的情況下,為1則結果反一下\),若還相等,最后比較尾數位,十分高效 源碼: ``` /*實現Comparable接口使Doubel對象變成可比較的對象 */ public final class Double extends Number implements Comparable<Double> { /*在java中將 1.0 /2.0 設置為正無窮大即 Infinity*/ public static final double POSITIVE_INFINITY = 1.0 / 0.0; /* 與上面相反 負無窮大 即 -Infinity */ public static final double NEGATIVE_INFINITY = -1.0 / 0.0; /* 將 0.0 /0.0 設置為一個非數字的字符串*/ public static final double NaN = 0.0d / 0.0; /* 設置最大值為1.7976931348623157e+308*/ public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308 Double.longBitsToDouble(0x0010000000000000L)}. /* 保存 double 類型的最小正標準值的常量,最小正標準值為 2-1022。它等于十六進制的浮點字面值 0x1.0p-1022,也等于Double.longBitsToDouble(0x0010000000000000L)。 */ public static final double MIN_NORMAL = 0x1.0p-1022; /*指數部最大值為2^1023 */ public static final int MAX_EXPONENT = 1023; /*指數部最小值為2^-1022 */ static final int MIN_EXPONENT = -1022; /*設置 長度為64位*/ public static final int SIZE = 64; /* 設置為 8個字節*/ public static final int BYTES = SIZE / Byte.SIZE; /*表示基本類型 double 的 Class 實例。 */ @SuppressWarnings("unchecked") public static final Class<Double> TYPE = (Class<Double>) Class.getPrimitiveClass("double"); } ``` ### 重點方法 * toHexString(double d)將Double的值轉換成十六進制,并返回成字符串 ``` public static String toHexString(double d) { if (!isFinite(d) ) //判斷是否超過double的最大值與最小值 return Double.toString(d);//如果超出了范圍就返回他的字符串 else { StringBuilder answer = new StringBuilder(24);//聲明了一個StringBuilder if (Math.copySign(1.0, d) == -1.0) //通過Math.copySign 返回的值來判斷傳入的double值是否為負數,如果是負數就是在上面的StringBuilder中添加一個負號 answer.append("-"); answer.append("0x");//十六進制以0x開頭 d = Math.abs(d);//將傳入的值進行絕對值轉換要是負數的話就變成整數,整數不變 if(d == 0.0) { answer.append("0.0p0");//如果傳入的值為0.0直接返回0x0.0p0 } else { //傳進來的值不為0.0 boolean subnormal = (d < DoubleConsts.MIN_NORMAL);//設置一個布爾變量 判斷是否小于DoubleConsts最小值 long signifBits = (Double.doubleToLongBits(d) & DoubleConsts.SIGNIF_BIT_MASK) | 0x1000000000000000L; answer.append(subnormal ? "0." : "1."); /*隔離低位十六進制的13位數字*/ String signif = Long.toHexString(signifBits).substring(3,16); answer.append(signif.equals("0000000000000") ? // 13 zeros "0": signif.replaceFirst("0{1,12}$", "")); answer.append('p'); answer.append(subnormal ? DoubleConsts.MIN_EXPONENT: Math.getExponent(d)); } return answer.toString(); } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看