文章編號: 69333 - 上次校閱: 2005年8月16日 - 版次: 2.2

如何解決浮點精確度/比較問題

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
全部展開 | 全部摺疊

結論

可靠的方式測試是否兩個浮點變數或運算式是相等 (使用 IEEE 格式或 MBF),您必須減去正在比較的兩個變數,然後測試其差異是否小於值,選擇在單一或雙精確度的重要性的限制。其他的測試相等,將會可靠。下列公式可靠地測試 X 和 Y 是否相等:

  1. 您必須為單精度測試是否 X 之差而 Y 是小於值 7 有效數字小於 X 或 Y。 除 X 或 Y 由 10 ^7,找出比較值。例如:
          ' To try this example in VBDOS.EXE:
          ' 1. From the File menu, choose New Project.
          ' 2. Copy the code example to the Code window.
          ' 3. Press F5 to run the program.
    
          IF ABS(X! - Y!) <= (X! / 10^7) THEN
             PRINT "Equal within 7 digits"
          ENDIF
    						
  2. 您必須為雙精度測試是否 X 之差而 Y 是小於 15 的值有效數字小於 X 或 Y。 除 X 或 Y 由 10 ^15 尋找比較值。例如:
          ' To try this example in VBDOS.EXE:
          ' 1. From the File menu, choose New Project.
          ' 2. Copy the code example to the Code window.
          ' 3. Press F5 to run the program.
    
          IF ABS(X# - Y#) <= (X# / 10^15) THEN
             PRINT "Equal within 15 digits"
          ENDIF
    						
IEEE 浮點數格式是在 [標準型] 和 [專業版的 Microsoft Visual Basic 的 MS-DOS 版本 1.0 ; 在 Microsoft QuickBasic MS-DOS (僅 QB87.EXE 副處理器版本)、 3.0、 4.0、 4.0b 和 4.5 版 ; 在 MS-DOS 和 MS OS/2,6.0 和 6.0b; 版本的 Microsoft 基本編譯器與找到在 Microsoft 基本專業開發系統 (PDS) MS-DOS 和 MS OS/2 7.0 和 7.1 版。

在 Microsoft QuickBasic MS-DOS (僅 QB.EXE-副處理器版本)、 版本 1.0 」、 「 第 1.01 」、 「 2.0 」、 「 2.01 及 「 3.0,和 MS-DOS 3.2、 3.22 及 3.23 版本的 Microsoft GW Basic 解譯器中,找不到 MBF (Microsoft 二進位格式)。

本文資訊也會包含在 [標準型] 和 [專業版的 Microsoft Visual Basic 隨附的 MS-DOS 版本 1.0 說明檔中。

其他相關資訊

注意: 計算數字中的有效數字可能會遺失限於下列: 多重特別遠一點值中的數字的加法或減法類似值中的數字的計算。當來自多個計算的數字結果時,您可能需要變更您的測試相等,使用較少的有效位數來反映數學遺失有效位數。如果您的測試的重要性使用太多的有效數字,您可能無法探索比較相等的數字是實際相等的正確度可能限制內。

在基本上面所列的產品使用 IEEE 浮點數格式,中繼計算會執行在暫存的內部 64 位元暫存器,其中有更多位元的精確度比儲存在單精度或雙精度變數中。這通常會導致 IF 陳述式傳回錯誤中繼計算的值不等於運算式所比較的狀態。例如:
   X = 25
   Y = 60.1
   IF 1502.5 = (X * Y) THEN PRINT "equal"
				
執行上述程式碼將不列印"等於"。相較之下,下列方法使用替代符號變數會列印 「 等於 」 但仍不可靠的技術做為測試是否相等:
   Z = 25 * 60.1
   IF 1502.5 = Z THEN PRINT "equal"
				
明確數值的型別轉換的附註 (! 為單一整數位數的雙精度 #) 會影響計算所儲存與列印的精確度。無論使用何種型別轉型您執行,您可能仍然會看到非預期的捨入結果:
   PRINT 69.82! + 1    ' Single precision, prints 70.82.
   PRINT 69.82# + 1    ' Double precision, prints 70.81999999999999.
				
For 的確切十進位 (基底 10) 數字表示例如計算的金錢和分會,您應該使用貨幣 (@) 在 MS-DOS]、 [1.0 版] 和 [基本 PDS MS-DOS 7.0 和 7.1 版的 Visual Basic 中找到的資料型別。貨幣資料型別完全儲存與小數點後 4 位數字的最多 19 個數字。

參考:

IEEE 和 MBF 標準嘗試正確性和精確度數字範圍與速度之間取得平衡。精確度測量多少顯著性位元的精確度不遺失在計算中。精確度指的是假數決定多少的十進位數字可以用來表示中位元數。

IEEE 格式及 MBF 儲存的表單 1.x,y 乘冪的數字 (其中 x 和 y 是基底 2 的數字 ; x 是尾數,y 是指數)。

MBF 單精度的尾數,24 位元且雙精度 56 位元的尾數。只是 24 或 56 位元內執行所有的 MBF 計算。

IEEE 單精度的尾數,24 位元且雙精度 53 位元的尾數。不過,所有單精確度與雙精度 IEEE 在 MS-DOS 1.0 版的 Visual Basic ; MS-DOS 版本 3.0/4.x 的 QuickBasic 中 ; 在 MS-DOS 版本 6.0 和 6.0b; 的基本編譯器和基本 PDS 中為 MS-DOS、 7.0 和 7.1re 版本執行計算更大的精確度為 64 位元暫存暫存器中。如此一來 IEEE 計算方法是比儘管 MBF 的能力來代表雙精度的更多個位元的 MBF 計算更精確。

十進位 (基底 10) 標記法中的大多數數字以單精確度與雙精度的資料型別中使用二進位 (基底 2) 浮點數儲存體格式沒有不到精確表示。IEEE 格式及 MBF 無法完全代表 (和必須捨入) 的 y 次方的表單 1.x 的不是所有數字 (其中 x 和 y 是基底 2 的數字)。可以完全表示的數字展現非常廣泛的範圍內。高密度表示的數字是附近 1.0 和-1.0,但如移向 [0] 或 [無限大的數字,就會發生您最最表示的數字。

上述限制經常會造成 Basic 傳回浮點結果比您想像的不同。更多有關本主題即可找到 「 Microsoft 知識庫 」 中查詢下列文字:
floating 和點和格式和 QuickBasic
IEEE 浮動點格式都記錄在下列手冊:

  1. 頁面 16-21"Microsoft QuickBasic 4.0:: 基本語言參考的"為 QuickBasic 的 MS-DOS,4.0 及 4.0b 版本。請注意 4.0 手冊需要校正,以在頁面 19 MHex $ 程式碼範例上的依照不同的發行項,藉由查詢下列字上找到 「 Microsoft 知識庫 」 中的說明:
    MHex $ AND 19
  2. 頁面 12-17"Microsoft QuickBasic 4.5: 基本語言參考的"的 MS-DOS 版本 4.5 的 QuickBasic。請注意,必須使用與版本 4.5 提供一個順序卡單獨排序這個選擇性的手冊。
  3. 頁面 702-705 的"Microsoft Basic 7.0: 開發者快速入門 」 Microsoft 基本 PDS 的 MS-DOS,7.0 和 7.1 版的。
MBF 浮動點格式中個別的發行項可以藉由查詢下列字上找到 「 Microsoft 知識庫 」 中的記錄:
MBF AND 轉換 AND 指數

這篇文章中的資訊適用於:
  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 for MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • Microsoft BASIC Professional Development System 7.1
  • Microsoft GW-BASIC 3.2
  • Microsoft GW-BASIC 3.22
  • Microsoft GW-BASIC 3.23
關鍵字:?
kbmt kbhowto KB69333 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:69333? (http://support.microsoft.com/kb/69333/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。