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 í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 to post comments
1 találat mutatása
Új válasz írása

Please first to submit.