您目前已離線,請等候您的網際網路重新連線

不支援您的瀏覽器

您必須更新瀏覽器,才能使用此網站。

更新至最新版本的 Internet Explorer

(完成)若要了解 IEEE 浮點數錯誤的教學課程

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:42980
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。
結論
浮點數學是一個複雜的主題混淆 manyprogrammers。下列教學課程應該可以幫助您在浮點錯誤可能會發生的地方,以及如何辨識 programmingsituations toavoid 它們。它應該也可讓您辨識的情況下,arecaused 固有的浮點運算限制為相對的 toactual 編譯器錯誤。
其他相關資訊

十進位及二進位數字系統

一般而言,我們會計算基底的 10] 中的項目。基底是 completelyarbitrary。人擁有傳統上使用適用 base10 的唯一原因在於它們都擁有 10 的手指,已經方便好用的 countingtools。

十進位 (基底 10) 中的數字 532.25 表示:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)       500    +     30     +      2     +     2/10    +    5/100   _________   =  532.25				

在二進位數字系統 (基數為 2) 中,每一欄代表而不是 10 的 powerof 2。例如,數字 101.01 表示 ︰:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)       4     +      0    +     1     +      0     +    1/4   _________   =  5.25  Decimal				

如何在 Pc 中表示的整數

因為沒有小數部分為整數,其 machinerepresentation 是浮點數的值大於更為簡單。在個人電腦 (Pc) 上的 Normalintegers 與 themost 重要的位元指示正負號的 long,其是 2 個位元組 (16 位元)。長整數是 4 個位元組。正值是簡單的二進位數字。例如:
    1 Decimal = 1 Binary    2 Decimal = 10 Binary   22 Decimal = 10110 Binary, etc.				

不過,負數的整數表示使用兩個 complementscheme。若要取得兩個補數表示的 negativenumber,採取編號的絕對 valueand 的二進位表示法,然後翻轉所有位元,並加上 1。例如:
   4 Decimal = 0000 0000 0000 0100               1111 1111 1111 1011     Flip the Bits   -4        = 1111 1111 1111 1100     Add 1				

請注意,-1 十進位 = 哪些 explainswhy 基本身分為邏輯 true-1 的二進位 」 1111年 1111年 1111 1111年 (所有位元 = 1)。這是沒有個別運算子的位元和 logicalcomparisons 的 aconsequence。通常在 Basic 中,很方便地使用程式碼 fragmentbelow,當您的程式將會進行許多的邏輯比較。Thisgreatly 有助於提高可讀性。
   CONST TRUE = -1   CONST FALSE = NOT TRUE				

請注意,加入任何組合的兩個互補數字 togetherusing 一般二進位運算會產生正確的結果。

浮點數的複雜性

每個十進位整數可完全由二進位整數 ; 不過,這不是小數的數字,則為 true。事實上,是基底 10 irrational 的 everynumber 也會在小於 10 的基底的 anysystem irrational。

之二進位檔,特別是,只有小數的數字,可以在其中 q 是 2 的整數乘冪,表單 p/q,berepresented 可以 beexpressed,透過有限數目的位元。

即使是一般的小數,例如小數點 0.0001 無法完全在二進位檔中的 berepresented。(0.0001 是重複的二進位 fractionwith,為 104 位元的一段)!

這解釋為什麼簡單的範例中,如下所示
   SUM = 0   FOR I% = 1 TO 10000      SUM = SUM + 0.0001   NEXT I%   PRINT SUM                   ' Theoretically = 1.0.				

將列印 1.000054 做為輸出。小錯誤 0.0001 在二進位表示會傳播到 [加總。

同樣地,您永遠都應該非常小心何時在真正的數字 makingcomparisons。下列範例說明了 acommon 的程式設計錯誤:
   item1# = 69.82#   item2# = 69.20# + 0.62#   IF item1# = item2# then print "Equality!"				

這不會列印"相等!",因為 69.82 不能讓產生的 theassignment 會稍有不同 (二進位) 值的二進位的 representedexactly 值比該運算式的 isgenerated。在練習中,您應該永遠在這種方式允許一些可容忍的 codesuch 比較。Forexample:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"				

這會列印"等於"。

IEEE 格式的數字

MS-DOS 3.0 版的 QuickBasic 所隨附 MBF (Microsoft 二進位浮點) 版本和 IEEE (協會 ofElectrical 電子電機工程師) 版本的 amath 副處理器的機器。MS-DOS、 版本 4.0 及 lateronly 的 QuickBasic 使用 IEEE。Microsoft 會選擇在目前版本的基本 IEEE 標準,為 representfloating 點值,為 followingthree 的主要理由:
  1. 若要允許使用 Intel 數學副處理器,請使用 IEEE 格式的基本。Intel 80 x 87 系列副處理器無法使用 Microsoft 二進位格式的數字。
  2. 若要使 interlanguage 呼叫 Basic、 C、 pascal 命名法、 FORTRAN 和 MASM 之間更容易。否則,轉換常式必須要用來將數值從一種語言傳送到另一個。
  3. 若要達到一致性。IEEE 是可接受的工業標準的 C 和 FORTRAN 編譯器。
以下是 IEEE 及 MBF representationsfor 的雙精度數字的快速比較:
               Sign Bits   Exponent Bits   Mantissa Bits               ---------   -------------   -------------   IEEE        1           11              52 + 1 (Implied)    MBF        1            8              56				

如需有關 IEEE 和 MBFfloating 點表示,查詢 Microsoft 知識庫 」 中下列字之間的差異的詳細資訊:
   IEEE and floating and point and appnote				

請注意 IEEE 有更多位元專用的指數的 allowsit 來代表較大範圍的值。MBF 有更多的尾數個位元,讓它變得更精確,其範圍較小的範圍內。

一般的浮點概念

請務必要瞭解任何二進位浮點 systemcan 表示有限的數字的浮點數值在 exactform 中。其他所有值都必須 closestrepresentable 值所計算都值。IEEE 標準指定的方法 forrounding 值為 「 最接近 」 表示的值。QuickBasicfor MS-DOS 支援的標準,並依照 IEEErules 將值捨入。

此外,請記住,可以在 IEEEare 中表示的數字分布在非常大的範圍。您可以想像它們 anumber 行上。沒有高密度表示的數字附近 1.0and-1.0 但較少且較少,移向 [0] 或 [無限大。

IEEE 標準,設計為 engineeringcalculations,目標是要最大化命中率 (若要取得到實際盡可能編號)。精確度指的是數字位數,youcan 代表。IEEE 標準會嘗試平衡專用指數數字 ofbits 與 thefractional 組件] 的數字,用來保留正確性和 precisionwithin 可接受的限制的位元數。

IEEE 詳細資料

浮點的數字被表示在下列表單中,其中 [指數] 為二進位指數:
   X =  Fraction * 2^(exponent - bias)				

[分數] 是數字的正規化分數部分,normalizedbecause 指數已調整,讓前置位元永遠為 a1。如此一來,它並沒有儲存,並取得一個較大的 bitof 精確度。這是隱含的位元的原因。您可以想像像科學標記法,其中您操作指數 tohave 一個數字的小數點左邊以外二進位,youcan 在一定的例項操作指數,使第一個位元是 1,sincethere 是唯一的順序為 1 和 0。

[偏差] 是用來避免儲存 negativeexponents 的偏差值。

單精度數字的 bias 是 127 和 1023年 (十進位) 的 fordouble 單精度數字。

值等於給所有的 0 到所有 1 的 (二進位) 是保留的 forrepresenting 特殊情況。沒有其他特殊的情況下,指出各種不同的錯誤狀況。

單精度範例

2 = 1 * 2 ^1 = 0100 0000 0000 0000...0000 0000 = 4000 0000 十六進位
請注意正負號位元為零,而儲存的指數為 128 或 100 0000 0 二進位,其為 127 加 1。儲存的尾數為 (1) 000 0000...0000 0000,其中會有前置數字 1 和二進位小數點,因此實際的尾數為 1。

-2 =-1 * 2 ^1 = 1100年 0000 0000 0000...0000 0000 = C000 0000 十六進位
與相同 + 2 不同之處在於設定正負號位元。這是適用於所有 IEEE 格式的浮點數。

4 = 1 * 2 ^2 = 0100年 0000 1000年 0000...0000 0000 = 4080 0000 十六進位
相同的尾數 ; 指數增加一個 (偏移的值為 129 或二進位的 100 0000 1。

6 = 1.5 * 2 ^2 = 0100年 0000 1100年 0000...0000 0000 = 40C 0 0000 十六進位
相同指數 ; 尾數是增加半--是 (1) 100 0000...0000 0000,因為這是二進位小數,這是 1-1/2 (小數數值為 1/2、 1/4、 1/8 等等。)。

1 = 1 * 2 ^0 = 0011 1111年 1000年 0000...0000 0000 = 3F80 0000 十六進位
為其他的 2 的次方的相同指數 ; 尾數為 127,或二進位的 011 1111年 1 2 減一。

.75 = 1.5 * 2 ^-1 = 0011 1111年 0100年 0000...0000 0000 = 3F40 0000 十六進位
偏移的指數為 126 011 1111年 0 二進位,而尾數為 (1) 100 0000...0000 0000,其為 1 1/2。

2.5 = 1.25 * 2 ^1 = 0100年 0000 0010 0000...0000 0000 = 4020 0000 十六進位
完全相同,2 除了代表 1/4 的位元是設定於尾數。

0.1 = 1.6 * 2 ^-4 = 0011 1101年 1100年 1100年...1100 1101 = 3DCC CCCD 十六進位
1/10 是重複二進位小數。假數是僅有 1.6,而偏移的指數 」 說明 1.6 是要除以 16 (它是十進位為 123 的二進位的 011 1101年 1)。真正的指數為 123 127 =-4,其表示要乘積的因數為 2 * *-4 = 1/16。請注意,儲存的尾數在最後一個位元會進位。這是嘗試儘可能精確地表示無法表示的數字。(原因 1/10 和 1/100 的二進位精確類似於 1/3 不完全無法以十進位的方式。)

0 = 1.0 * 2 ^-128 = 所有的 0-特殊案例。

其他常見的浮點數錯誤

以下是常見的浮點錯誤:
  1. 無條件捨去的錯誤

    當所有的位元二進位數字不能用在計算時,就會產生這個錯誤。

    範例: 新增 0.0001 到 0.9900 (單精度)

    小數點 0.0001 會表示為:
    (1) 10100011011011100010111 * 2^(-14+Bias) (13 前置 0 秒以二進位)!
    0.9900 會表示為:
    (1) 11111010111000010100011 * 2^(-1+Bias)。
    現在實際將這些數字相加,必須對齊小數點 (二進位)。這必須是 Unnormalized。以下是產生加法:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained      +.111111010111000010100011 * 2^0      ________________________________       .111111010111011100110000 * 2^0						
    因為有些電腦捨入,以加入在移位時,這就稱為無條件捨去的錯誤。其他人只是截斷。無條件捨去的錯誤是一定要考慮每次您新增或乘以兩個完全不同的值。
  2. 減去兩個幾乎等於值
           .1235      -.1234       _____       .0001						
    這將會正常化。請注意雖然原始數字每四個有效位數,結果只有一個有效位數。
  3. 溢位和反向溢位

    會發生這種情況是當結果太大或太小,無法由資料型別。
  4. 量化錯誤

    這會發生這些無法以浮點數標準完全相同的形式的數字。
  5. 除數非常小的數字

    這可以觸發一個 「 除以零 」 的錯誤,或者可能會產生錯誤的結果,如下列範例所示:
          A = 112000000      B = 100000      C = 0.0009      X = A - B / C						
    在 QuickBasic 的 MS-DOS,現在 X 有值 888887,而不是正確的答案,900000。
  6. 輸出錯誤

    當輸出函式改變他們正在使用的值時,就會發生這種類型的錯誤。
1.00 容量是 2.00 3.00 4.00 4.00b 4.50 6.00 6.00b 7.00 7.10 IEEETUTR

警告:本文為自動翻譯

內容

文章識別碼:42980 - 最後檢閱時間:01/04/2015 02:41:00 - 修訂: 4.0

  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft BASIC Professional Development System 7.0
  • kbmt KB42980 KbMtzh
意見反應
//c.microsoft.com/ms.js'><\/script>");