Hogy lehet, hogy két triviálisan egyenlő szám az R szerint mégsem az?

0
0
Nézzük meg a következő nagyon egyszerű kódot: i <- 0.1 i <- i + 0.05 i ## [1] 0.15 if(i==0.15) cat("i egyenlő 0.15-tel") else cat("i nem egyenlő 0.15-tel") ## i nem egyenlő 0.15-tel (i==0.15) ## [1] FALSE Vajon miért nem egyenlőek?
  • You must to post comments
0
0
Ez egy klasszikusan nagyon bosszantó probléma (ami ráadásul egy kezdőnek könnyen elveheti a kedvét), ami igazából csak addig probléma, amíg a mögöttes programozási logikát nem értjük. Mi történik itt valójában? Mivel nem lehet minden számot pontosan leképezni az IEEE lebegőpontos aritmetika szerint (az [IEEE szabvány][1] írja le a lebegőpontos műveleteket), ezért előfordulnak ilyen furcsaságok, hogy az eredmények nem egyeznek meg egzakt módon a várt értékkel. Bizonyos értékeket - így a véges tizedeseket (például 0.1 és 0.05) számítógép valójában nem pontosan tárolják, és így a számtani eredmény sem pontos eredmény. i <- 0.1 (i <- i + 0.05) ## [1] 0.15 diff(c(i, 0.15), 1) ## [1] -2.775557562e-17 Megoldások: ---------- Az egyik lehet például a kerekítés: diff(c(round(i,2), 0.15), 1) ## [1] 0 (round(i,2)==0.15) ## [1] TRUE De ennél talán jobb megoldás szerintem: all.equal(i,0.15) ## [1] TRUE Az `all.equal` használatakor viszont ügyeljünk arra, hogy ha mégsem egyenlő a két értek, akkor nem `FALSE` lesz az eredmény, hanem az eltérés. Ezért `if` feltétel esetén `isTRUE` függvénnyel célszerű használni: isTRUE(all.equal(i,0.15)) ## [1] TRUE isTRUE(all.equal(i,0.2)) ## [1] FALSE [1]: http://en.wikipedia.org/wiki/IEEE_floating_point
  • You must to post comments
1 találat mutatása
Új válasz írása

Please first to submit.