UTT #2 – Kvadratroden af 2 i anden er ikke 2

by Jesper maj 06, 2008 21:43

Paradoksalt nok, så får man problemer, når man skal teste med tal-typer med stor nøjagtighed. Jeg oplevede det første gang, i forbindelse med udregninger af rotationer i Vector3 i MDX. I starten var jeg ret forundret over, at der var så stor unøjagtighed på en PC i det andet millennium. Det hænger selvfølgelig sammen med afrundigsfejl, i de forskellige algoritmer, men hvordan tester man så med disse unøjagtigheder? Tag følgende test: Kvadratroden af 2 i anden skal være lig med 2.

[code=csharp][TestMethod] public void Frem_og_tilbage() { double sqr = Math.Sqrt(2d); double sq = sqr * sqr; Assert.AreEqual(2, sq, "Frem og tilbage er ikke det samme"); } [/code]

Den fejler med følgende kryptiske fejl: Assert.AreEqual failed. Expected:<2>. Actual:<2>. Frem og tilbage er ikke det samme – 2 er ikke 2!
Sætter man et breakpoint, og ser på værdierne i debuggeren, ser man at: sq = 2.0000000000000004, hvilket jo klart nok ikke er 2.

Den generiske udgave af AreEqual er ikke helt god nok, når det kommer til sammenligning af tal med høj nøjagtighed, og man føler et behov for en overload, med angivelse af en afvigelse. Ser man derimod efter på den almindelige udgave af AreEqual, finder man straks det man søger, og man er i stand til at lave følgende test, der tager højde for usikkerheden i System.Math.

[code=csharp][TestMethod] public void Frem_og_tilbage_er_lige_langt() { double sqr = Math.Sqrt(2d); double sq = sqr * sqr; Assert.AreEqual(2, sq, 0.000001d, "Frem og tilbage er ikke det samme"); } [/code]

Green Lights makes me happy…    

Tags:

Kommentarer

13-05-2008 22:16:59 #

Brian

Problemet med reelle tal og computere er jo simpelt. Hvis du afsætter et endelig antal bits til at repræsentere en uendelig mængde, bliver man jo nødt til at tabe nogen på gulvet. Faktisk er der uendelig mange reelle tal, der ikke kan repræsenteres med et endelig antal bits Smile

Brian

Brian Denmark

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS