is.finite(x) is.infinite(x) Inf NaN is.nan(x)
is.finite
returns a vector of the same length as x
the jth element of which is TRUE
if the jth element of x
is
finite (i.e. it is not one of the values NA
, NaN
,
Inf
or -Inf
).
is.infinite
returns a vector of the same length as x
the jth element of which is TRUE
if the jth element of x
is
infinite (i.e. equal to one of Inf
or -Inf
).
pi / 0 ## = Inf a non-zero number divided by zero creates infinity 0 / 0 ## = NaN 1/0 + 1/0# Inf 1/0 - 1/0# NaN 1/0 == Inf 1/Inf == 0 exp(-Inf) == 0 ## (actually, the last one seems to give NA on not-very-new ## versions of Linux, which is a Linux bug and seems to be ## corrected in newer 'libc6' based Linuxen). is.na(0/0) # T !is.na(Inf)# T is.nan(0/0)# T (!is.nan(NA)) && (!is.infinite(NA)) && (!is.finite(NA)) # TRUE!! ( is.nan(NaN)) && (!is.infinite(NaN)) && (!is.finite(NaN))# TRUE!! !is.nan(NA) all(!is.nan(c(1,NA))) all(c(F,T,F) == is.nan(c (1,NaN,NA))) all(c(F,T,F) == is.nan(list(1,NaN,NA)))#-> FALSE 'BUGlet' [coerce.c] # However, S is different anyway. pi / 0 ## = Inf a non-zero number divided by zero creates infinity 0 / 0 ## = NaN 1/0 + 1/0# Inf 1/0 - 1/0# NaN 1/0 == Inf 1/Inf == 0 exp(-Inf) == 0 ## (actually, the last one seems to give NA on not-very-new ## versions of Linux, which is a Linux bug and seems to be ## corrected in newer 'libc6' based Linuxen). is.na(0/0) # T !is.na(Inf)# T is.nan(0/0)# T (!is.nan(NA)) && (!is.infinite(NA)) && (!is.finite(NA)) # TRUE!! ( is.nan(NaN)) && (!is.infinite(NaN)) && (!is.finite(NaN))# TRUE!! !is.nan(NA) all(!is.nan(c(1,NA))) all(c(F,T,F) == is.nan(c (1,NaN,NA))) all(c(F,T,F) == is.nan(list(1,NaN,NA)))#-> FALSE 'BUGlet' [coerce.c] # However, S is different anyway. lgamma(Inf) == Inf Inf + Inf == Inf Inf - Inf == NaN # NA --- should test with 'is.nan() (1/0) * (1/0)# Inf (1/0) / (1/0)# NaN pm <- c(-1,1) # 'pm' = plus/minus log(0) == - 1/0 exp(-Inf) == 0 sin(Inf) cos(Inf) tan(Inf) all(atan(Inf*pm) == pm*pi/2) # TRUE x <- c(100,-1e-13,Inf,-Inf, NaN, pi, NA) x # 1.000000 -3.000000 Inf -Inf NA 3.141593 NA names(x) <- formatC(x, dig=3) is.finite(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- T T . . . T . is.na(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- . . . . T . T which(is.na(x) & !is.nan(x))# only 'NA': 7 is.na(x) | is.finite(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- T T . . T T T is.infinite(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- . . T T . . . ##-- either finite or infinite or NA: all(is.na(x) != is.finite(x) | is.infinite(x)) # TRUE all(is.nan(x) != is.finite(x) | is.infinite(x)) # FALSE: have 'real' NA ##--- Integer (ix <- structure(as.integer(x),names= names(x))) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- 100 . 2147483647 -2147483648 NA 3 NA all(is.na(ix) != is.finite(ix) | is.infinite(ix)) # TRUE (still) ix[3] == (iI <- as.integer(Inf))#> warning: inaccurate integer conversion! ix[4] == (imI<- as.integer(-Inf)) iI == .Machine$integer.max # TRUE imI == -.Machine$integer.max # TRUE ##--- Overflow in simple integer arithmetic: as.integer(2)*iI # -2 as.integer(3)*iI # 2147483645 as.integer(3)*iI == iI-2 # TRUE storage.mode(ii <- -3:5) storage.mode(zm <- outer(ii,ii, FUN="*"))# integer storage.mode(zd <- outer(ii,ii, FUN="/"))# double range(zd, na.rm=T)# -Inf Inf zd[,ii==0] (storage.mode(print(1:1 / 0:0)))# Inf "double" (storage.mode(print(1:1 / 1:1)))# 1 "double" (storage.mode(print(1:1 + 1:1)))# 2 "integer" (storage.mode(print(2:2 * 2:2)))# 4 "integer" lgamma(Inf) == Inf Inf + Inf == Inf Inf - Inf == NaN # NA --- should test with 'is.nan() (1/0) * (1/0)# Inf (1/0) / (1/0)# NaN pm <- c(-1,1) # 'pm' = plus/minus log(0) == - 1/0 exp(-Inf) == 0 sin(Inf) cos(Inf) tan(Inf) all(atan(Inf*pm) == pm*pi/2) # TRUE x <- c(100,-1e-13,Inf,-Inf, NaN, pi, NA) x # 1.000000 -3.000000 Inf -Inf NA 3.141593 NA names(x) <- formatC(x, dig=3) is.finite(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- T T . . . T . is.na(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- . . . . T . T which(is.na(x) & !is.nan(x))# only 'NA': 7 is.na(x) | is.finite(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- T T . . T T T is.infinite(x) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- . . T T . . . ##-- either finite or infinite or NA: all(is.na(x) != is.finite(x) | is.infinite(x)) # TRUE all(is.nan(x) != is.finite(x) | is.infinite(x)) # FALSE: have 'real' NA ##--- Integer (ix <- structure(as.integer(x),names= names(x))) ##- 100 -1e-13 Inf -Inf NaN 3.14 NA ##- 100 . 2147483647 -2147483648 NA 3 NA all(is.na(ix) != is.finite(ix) | is.infinite(ix)) # TRUE (still) ix[3] == (iI <- as.integer(Inf))#> warning: inaccurate integer conversion! ix[4] == (imI<- as.integer(-Inf)) iI == .Machine$integer.max # TRUE imI == -.Machine$integer.max # TRUE ##--- Overflow in simple integer arithmetic: as.integer(2)*iI # -2 as.integer(3)*iI # 2147483645 as.integer(3)*iI == iI-2 # TRUE storage.mode(ii <- -3:5) storage.mode(zm <- outer(ii,ii, FUN="*"))# integer storage.mode(zd <- outer(ii,ii, FUN="/"))# double range(zd, na.rm=T)# -Inf Inf zd[,ii==0] (storage.mode(print(1:1 / 0:0)))# Inf "double" (storage.mode(print(1:1 / 1:1)))# 1 "double" (storage.mode(print(1:1 + 1:1)))# 2 "integer" (storage.mode(print(2:2 * 2:2)))# 4 "integer"