4.6 Srovnání čísel

Ke srovnání aritmetických hodnot slouží následující operátory: porovnání shody celých čísel (==), různosti celých čísel (!=), větší (<), větší rovno (<=), menší (>) a menší rovno (>=). Výsledkem srovnání je logická hodnota TRUE nebo FALSE:

1L == 3L
## [1] FALSE
2L == 2L
## [1] TRUE
1L != 3L
## [1] TRUE
1 < 3
## [1] TRUE
1 > 3
## [1] FALSE

Srovnat stejnost nebo různost dvou reálných čísel není pomocí operátorů == a != možné. R sice srovnání provede, ale to nemusí mít žádný smysl, jak ukazuje následující příklad:

x1 <- 0.5 - 0.3
x2 <- 0.3 - 0.1
x1 == x2                           # na většině počítačů FALSE
## [1] FALSE

Důvod je ten, že necelá čísla, která v desítkové soustavě vypadají nezáludně, není vždy možné vyjádřit dobře ve dvojkové soustavě a výsledek se proto zaokrouhluje. Proto přestože je výsledek předchozích operací v desítkové soustavě stejný (1/10), ve dvojkové soustavě dopadne jinak.

Ke srovnání dvou reálných čísel slouží následující fráze:

identical(all.equal(x1, x2), TRUE) # TRUE všude
## [1] TRUE

Funkce all.equal() vrací logickou hodnotu TRUE, pokud jsou všechny prvky dvou vektorů stejné; jinak vrací komentář k velikosti rozdílů. Ovšem “jsou stejné” je v této funkci chápáno volně: dvě reálná čísla jsou stejná, pokud se neliší více než o několik násobků strojové přesnosti počítače. Funkce identical() vrací logickou hodnotu TRUE, pokud jsou dva objekty identické; jinak vrací FALSE. Dohromady vrátí fráze hodnotu TRUE jen v případě, kdy jsou obě téměř stejná (až na chybu, která zřejmě vznikla kvůli tomu, jak jsou reálná čísla v počítači uložená).

Balík dplyr nabízí ke srovnání hodnot typu double příjemnou funkci near()

dplyr::near(x1, x2)  # TRUE všude
## [1] TRUE