2012-01-20 42 views
2

作爲開發數值方法庫的一部分,我經常添加單元測試。大多數Assert.AreEqual類型測試目前最多檢查6個小數位數,因爲這種類型的庫不需要超過這個精度。迄今爲止,這些測試已經很好地服務於他們的目的。在單元測試中使用數字高精度的情況

最近,在研究同一個庫的64位版本時,我發現相當多的單元測試的結果在小數點後6位是相同的,但是在小數點後10位或更高處發生變化。我如何從頭開始瞭解這種情況是一個完全不同的故事,但是追逐其中的一些導致瞭解決我從來不知道存在的一些微妙的錯誤。

這使我想到:在單元測試中高精度地檢查數字(例如,10-12位數)似乎是有價值的,或者可能是完全精確的(甚至不知道該怎麼做),即使庫的精度要求不高。這裏的社區通常會爲科學/數字代碼的單元測試數值做些什麼?任何建議/建議/指針?

更多信息:圖書館處理雙重價值。它不是一個金融圖書館等,所以我不使用小數。

+2

如果要求該函數返回一個正確的N個小數位的答案,並且你的函數通過了一系列仔細選擇的測試,那麼在第(N + 1)次之後你的函數是否隨機化一切並不重要小數位,或將其設置爲等於系統時間除以單位指針。那麼,我想你的問題真正的答案不是「使用更高的精度」,而是「使用更好的測試用例」。 – Patrick87

+0

在JUnit中,您可以指定浮點比較所需的平等度。 – Cuga

+0

你使用什麼數據類型?你爲圖書館創建了什麼,'Decimal'或'Float' /'Double'?因爲如果它是最後兩個之一,我對你有'壞'的消息... –

回答

0

我不認爲你的問題存在任何解決方案(不使用量子計算機)。有兩種可能性我聽說過。

  1. 您正在使用具有有限表示(理性和所有基於它們)的數字工作。在這種情況下,您可以簡單地比較/測試這些表示與全精度

  2. 表示不是有限的(非理性和所有基於它們)。在這種情況下,您完全無法執行任何操作(包括測試),因爲您的內存量有限。你必須爲你的操作選擇精度,然後你只能測試到那個精度。

還有 '之間' 的東西:

  • 您使用代數/符號計算,而不是值計算

    。在這種情況下,即使您正在處理(假設)實數,實際上您正在使用其有限表示法,如'pi','e'或'sqrt(3)'。並且,爲您帶來的#1

  • 你不喜歡(4),你的輸入和輸出,從#1但是你的計算過程導致通過#2,因此有它的所有限制計算平方根運算

相關問題