<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 2.2.3 浮點數類型 float 浮點數就是包含小數點的數,大體對應于數學中的實數集合。現實世界中的職工工資(以 元為單位)、房屋面積(以平方米為單位)、人的身高(以米為單位)、圓周率等在程序中都 適合用浮點數表示。 Python 語言提供了類型 float 用于表示浮點數。float 類型的字面值形式與數學中的 寫法基本一致,但是允許小數點后面沒有任何數字(表示小數部分為 0),例如下列字面值 都是浮點數: ``` 3.1415 -6.78 123.0 0\. -6. ``` Python 為浮點數類型提供了通常的加減乘除等運算,運算符與整數類型是一樣的(見 表 2.1)。但是,與整數類型不同的是,運算符“/”用于浮點數時,是要保留小數部分的, 例如: ``` >>> 11.0 / 3.0 3.6666666666666665 ``` 沒錯,最后一位小數是 5 而不是 6!原因見下面關于浮點數內部表示的內容。 將一個浮點數賦值給變量,則該變量就是 float 類型(實際上是指向一個 float 類型的數據)。例如: ``` >>> f = 3.14 >>> type(f) <type 'float'> ``` 浮點數運算同樣可以和變量賦值結合起來,形成如表 2.2 所示的簡寫形式。 浮點數的能力與限制 浮點數類型能夠表示巨大的數值,能夠進行高精度的計算。但是,由于浮點數在計算機 內是用固定長度的二進制表示的,有些數可能無法精確地表示,只能存儲帶有微小誤差的近 似值。例如, ``` >>> 1.2 – 1.0 0.19999999999999996 ``` 結果比 0.2 略小。又如: ``` >>> 2.2 – 1.2 1.0000000000000002 ``` 結果比 1.0 略大。然而,下面這個表達式卻計算出了精確結果: ``` >>> 2.0 – 1.0 1.0 ``` 盡管浮點表示帶來的這種微小誤差不至于影響數值計算實際應用,但在程序設計中仍然 可能導致錯誤。例如,萬一某個程序中需要比較 2.2 ? 1 是否等于 1.2,那我們就得不到 預期的肯定回答,因為 Python 的計算結果是不相等!請看下面兩個比較式: ``` >>> (1.2 – 1.0) == 0.2 False >>> (2.0 – 1.0) == 1.0 True ``` 先解釋一下,上例中用到了比較兩個表達式是否相等的運算符“==”,另外顯示結果出 現了表示真假的布爾值 True 和 False,這些內容在后面布爾類型一節中有詳細介紹。從 這個例子我們得到一條重要的經驗:不要對浮點數使用==來判斷是否相等。正確的做法是 檢查兩個浮點數的差是否足夠小,是則認為相等。例如: ``` >>> epsilon = 0.0000000000001 >>> abs((1.2 – 1.0) - 0.2) &lt; epsilon True ``` 另外從運算效率考慮,與整數類型 int 相比,浮點數類型 float 的運算效率較低,由 此我們得出另一條經驗:如果不是必須用到小數,那就應當使用整數類型。 科學記數法 對于很大或很小的浮點數,Python 會自動以科學記數法來表示。所謂科學記數法就是 以“a×10 的整數次冪”的形式來表示數值,其中 1 &lt;= abs(a) &lt; 10。例如,12345 可 以表示成 1.2345e+4,0.00123 可以表示為 1.2345e-3。下面是 Python 的計算例子: ``` >>> 1234.5678 ** 9 6.662458388479362e+27 >>> 1234.5678 ** -9 1.5009474606688535e-28 ``` 正如 int 不同于整數集 I 一樣,Python 的 float 也不同于實數集 R,因為 float 仍 然只能表示有限的浮點數。當一個表達式的結果超出了浮點數表示范圍的時候,Python 會 顯示結果為 inf(無窮大)或-inf(負無窮)。讀者可以做一個有趣但略顯麻煩的實驗,試 一試 Python 最大能表示多大的浮點數。下面是本書著者所做的實驗結果,可以看到,最大 浮點數的數量級是 10308,有效數字部分已經精確到小數點后面第 53 位(Python 在顯示結果 時只保留小數點后 16 位),當該位為 6 時是合法的浮點數,當該位為 7 時則超出范圍。 ``` >>> 1.79769313486231580793728971405303415079934132710037826e+308 1.7976931348623157e+308 >>> 1.79769313486231580793728971405303415079934132710037827e+308 inf ``` 順便說一下,如果讀者做這個實驗,相信你一定會采用一種快速有效的策略來確定每一 位有效數字,而不會對每一位都從 0 試到 9。例如,當發現 1.7…1e+308 是合法的浮點數, 而 1.7…9e+308 超出了范圍,接下去應當檢查 1.7…5e+308 的合法性。這種方法就是本 書后面算法設計一章中介紹的二分查找策略。我們在第 1 章說過,計算思維人人皆有、處處 可見,不是嗎? 自動類型轉換 float 類型與 float 類型的數據相互運算,結果當然是 float 類型。問題是 float 類型能與 int 或 long 類型進行運算嗎? 由于整數、長整數和浮點數都是數值(在數學上都屬于實數集合 R),因此 Python 允許 它們混合運算,就像 int 可以與 long 混合運算一樣。Python 在對混合類型的表達式進行 求值時,首先將 int 或 long 類型轉換成 float,然后再執行 float 運算,結果為 float 類型。例如: ``` >>> type(2 + 3.0) <type 'float'> >>> type(2 + 3L * 4.5) <type 'float'> ``` 手動類型轉換 除了在計算混合類型的表達式時 Python 自動進行類型轉換之外,有時我們還需要自己 手動轉換類型。這是通過幾個類型函數 int()、long()和 float()實現的。例如,當我 們要計算一批整型數據的平均值,程序中一般會先求出這批數據的總和 sum,然后再除以數 據的個數 n,即: ``` average = sum / n ``` 但這個結果未必如我們所愿,因為 sum 和 n 都是整數,Python 執行的是整數除法,小數部 分被舍棄了,導致結果誤差太大。為解決此問題,我們需要手動轉換數據類型: ``` average = float(sum) / n ``` 其中 float()函數將 int 類型的 sum 轉換成了 float 類型,而 n 無需轉換,因為 Python 在計算 float 與 int 混合的表達式時,會自動將 n 轉換成 float 類型。 要注意的是,下面這種轉換方式是錯誤的: ``` average = float(sum/n) ``` 因為括號里的算式先計算,得到的就是整除結果,然后再試圖轉換成 float 類型時,已經 為時已晚,小數部分已經丟失了。 其實,調用類型函數來手動轉換類型并不是好方法,我們有更簡單、更高效的做法。如 果已知的數據都是整數類型的,而我們又希望得到浮點類型的結果,那么我們可以將表達式 涉及的某個整數或某一些整數加上小數點,小數點后面再加個 0,這樣整數運算就會變成浮 點運算。例如求兩個整數的平均值: ``` >>> x = 3 >>> y = 4 >>> z = (x + y) / 2.0 >>> z 3.5 ``` 例中我們人為地將數據個數 2 寫成了 2.0,這樣就使計算結果變成了 float 類型。 當然,在將浮點數轉換成整數類型時,就沒有這種簡便方法了,只能通過類型函數來轉換。例如: ``` >>> int(3.8) 3 >>> long(3.8) 3L ``` 可見,float 類型轉換成 int 或 long 時,只是簡單地舍去小數部分,并沒有做四舍五入。 如果希望得到四舍五入的結果,一個小技巧是先為該值(正數)加上 0.5 再轉換。更一般 的方法是調用內建函數 round(),它專門用于將浮點數轉換成最接近的整數部分。不過舍 入后的結果仍然是 float,為了得到 int 類型的數據還需要再用 int()轉換。例如: ``` >>> round(3.14) 3.0 >>> round(-3.14) -3.0 >>> round(3.5) 4.0 >>> round(-3.5) -4.0 >>> int(round(-3.14)) -3 ```
                  <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>

                              哎呀哎呀视频在线观看