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
:
== 3L 1L
## [1] FALSE
== 2L 2L
## [1] TRUE
!= 3L 1L
## [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:
<- 0.5 - 0.3
x1 <- 0.3 - 0.1
x2 == x2 # na většině počítačů FALSE x1
## [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()
::near(x1, x2) # TRUE všude dplyr
## [1] TRUE