• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 使用浮點數和小數中的技巧和陷阱

    發表于:2008-09-09來源:作者:點擊數: 標簽:點數小數陷阱技巧
    關鍵字:浮點數 技巧 陷阱 -------------------------------------------------------------------------------- 雖然幾乎每種處理器和編程語言都支持浮點運算,但大多數 程序員 很少注意它。這容易理解 — 我們中大多數很少需要使用非整數類型。除了科學計
    關鍵字:浮點數 技巧 陷阱

    --------------------------------------------------------------------------------
    雖然幾乎每種處理器和編程語言都支持浮點運算,但大多數程序員很少注意它。這容易理解 — 我們中大多數很少需要使用非整數類型。除了科學計算和偶爾的計時測試或基準測試程序,其它情況下幾乎都用不著它。同樣,大多數開發人員也容易忽略 java.math.BigDecimal 所提供的任意精度的小數 — 大多數應用程序不使用它們。然而,在以整數為主的程序中有時確實會出人意料地需要表示非整型數據。例如,JDBC 使用 BigDecimal 作為 SQL DECIMAL 列的首選互換格式。

    IEEE 浮點

    Java 語言支持兩種基本的浮點類型: float 和 double ,以及與它們對應的包裝類 Float 和 Double 。它們都依據 IEEE 754 標準,該標準為 32 位浮點和 64 位雙精度浮點二進制小數定義了二進制標準。

    IEEE 754 用科學記數法以底數為 2 的小數來表示浮點數。IEEE 浮點數用 1 位表示數字的符號,用 8 位來表示指數,用 23 位來表示尾數,即小數部分。作為有符號整數的指數可以有正負之分。小數部分用二進制(底數 2)小數來表示,這意味著最高位對應著值 ?(2 -1),第二位對應著 ?(2 -2),依此類推。對于雙精度浮點數,用 11 位表示指數,52 位表示尾數。

    因為用科學記數法可以有多種方式來表示給定數字,所以要規范化浮點數,以便用底數為 2 并且小數點左邊為 1 的小數來表示,按照需要調節指數就可以得到所需的數字。所以,例如,數 1.25 可以表示為尾數為 1.01,指數為 0: (-1) 0*1.01 2*2 0

    數 10.0 可以表示為尾數為 1.01,指數為 3: (-1) 0*1.01 2*2 3

    特殊數字

    除了編碼所允許的值的標準范圍(對于 float ,從 1.4e-45 到 3.4028235e+38),還有一些表示無窮大、負無窮大、 -0 和 NaN(它代表“不是一個數字”)的特殊值。這些值的存在是為了在出現錯誤條件(譬如算術溢出,給負數開平方根,除以 0 等)下,可以用浮點值集合中的數字來表示所產生的結果。

    這些特殊的數字有一些不尋常的特征。例如, 0 和 -0 是不同值,但在比較它們是否相等時,被認為是相等的。用一個非零數去除以無窮大的數,結果等于 0 。特殊數字 NaN 是無序的;使用 == 、 < 和 > 運算符將 NaN 與其它浮點值比較時,結果為 false 。如果 f 為 NaN,則即使 (f == f) 也會得到 false 。如果想將浮點值與 NaN 進行比較,則使用 Float.isNaN() 方法。表 1 顯示了無窮大和 NaN 的一些屬性。

    表 1. 特殊浮點值的屬性

    表達式 結果
    Math.sqrt(-1.0) -> NaN
    0.0 / 0.0 -> NaN
    1.0 / 0.0 -> 無窮大
    -1.0 / 0.0 -> 負無窮大
    NaN + 1.0 -> NaN
    無窮大 + 1.0 -> 無窮大
    無窮大 + 無窮大 -> 無窮大
    NaN > 1.0 -> false
    NaN == 1.0 -> false
    NaN < 1.0 -> false
    NaN == NaN -> false
    0.0 == -0.01 -> true

    基本浮點類型和包裝類浮點有不同的比較行為

    使事情更糟的是,在基本 float 類型和包裝類 Float 之間,用于比較 NaN 和 -0 的規則是不同的。對于 float 值,比較兩個 NaN 值是否相等將會得到 false ,而使用 Float.equals() 來比較兩個 NaN Float 對象會得到 true 。造成這種現象的原因是,如果不這樣的話,就不可能將 NaN Float 對象用作 HashMap 中的鍵。類似的,雖然 0 和 -0 在表示為浮點值時,被認為是相等的,但使用 Float.compareTo() 來比較作為 Float 對象的 0 和 -0 時,會顯示 -0 小于 0 。

    浮點中的危險

    由于無窮大、NaN 和 0 的特殊行為,當應用浮點數時,可能看似無害的轉換和優化實際上是不正確的。例如,雖然好象 0.0-f 很明顯等于 -f ,但當 f 為 0 時,這是不正確的。還有其它類似的 gotcha,表 2 顯示了其中一些 gotcha。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>