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 login to post comments
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 í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
- You must login to post comments
Please login first to submit.