Mam kilka testów jednostkowych C#, które wykonują niektóre operacje float/double i chciałbym je przetestować w jednostce. Assert.AreEqual jest niewystarczający z powodu błędów zaokrąglania.Operacje testowania jednostek w Visual Studio 2008 Pro
Przenieś konwersję jednostek jako przykład. 10,5 metrów do stóp ma współczynnik konwersji 3,281, więc otrzymuję 34,4505. Zastosowanie dokładniejszego współczynnika konwersji daje mi 34.4488189. Chcę przetestować to w, powiedzmy, 0,1 (więc 34.3488-34.5488 przejdzie test).
mogłem pewna ręcznie testować wartość z tolerancją w moim badanej jednostki, ale to bardzo powtarzalne i komunikat awaria nie byłoby bardzo opisowy (ponownie bez konieczności napisać własny komunikat o niepowodzeniu Assert):
Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1);
W jaki sposób mogę przetestować moje operacje float w granicach pewnej tolerancji błędu? Nie mogę znaleźć żadnych klas Assert, które robią to, które pochodzą z VS. Czy tęsknię za tobą, czy też muszę przetoczyć własną?
Czy istnieją standardowe praktyki testowania zmiennoprzecinkowych/debugowych, o których należy pamiętać?
Hah! 18 przeciążeń dla AreEqual. Nic dziwnego, że tego nie złapałem. –
ostrzeżenie, używając 'double.Epsilon' nie zrobi tego, co chcesz. Epsilon to najmniejsza wartość podwójnej precyzji. Dotyczy to tylko porównań wartości, które są rzędu 10^-324, co jest bardzo mało prawdopodobne.To, co chcesz zrobić, to porównać podwójne wartości do ostatniej cyfry, którą mogą reprezentować. Tak więc tolerancja może wynosić tysiąc, jeśli porównasz wartości w kwadrylionach. Słowo "buzz" to "ULP" (jednostki na ostatnim miejscu). zobacz http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm –