Es imposible no cometer un error a la hora de ajustar un número de máquina, ya que todos los números tienen un espacio asignado y números con infinitos decimales no se pueden almacenar en memoria correctamente. Este «pequeño» error puede influir en nuestra programación. Vamos a crear una función en R que nos permita ejemplificar cómo pueden influir los errores de aproximación de los números de máquina en la programación. La siguiente función realiza la operación aritmética 1.1/11, 3.3/33… y, mediante la función ifelse, creamos una condición:

valores_maquina <- function(num) {
  operacion <- ((num * 11) / 10) / (num * 11)
  print(operacion)
  ifelse(operacion < 0.1, "OK", "MAL")
}

La función valores_maquina tiene un solo parámetro y realiza una operación que genera el valor 0.1; con ifelse, si ese valor generado es menor que 0.1 nos pondrá OK, si no es menor nos pondrá MAL. En principio siempre debería poner el valor MAL, ya que 0.1 < 0.1 es falso. Entonces:

valores_maquina(1)
# [1] 0.1
# [1] "MAL"

valores_maquina(2)
# [1] 0.1
# [1] "MAL"

valores_maquina(3)
# [1] 0.1
# [1] "OK"

valores_maquina(4)
# [1] 0.1
# [1] "MAL"

valores_maquina(5)
# [1] 0.1
# [1] "MAL"

valores_maquina(6)
# [1] 0.1
# [1] "OK"

valores_maquina(7)
# [1] 0.1
# [1] "MAL"

¡Aquí pasa algo! Los ceros y unos es lo que tienen… Esto es debido a los números de máquina; en la red encontraréis mucha documentación al respecto sobre este tema. Pero desde aquí recomendaros que uséis la función round():

valores_maquina <- function(num) {
  operacion <- ((num * 11) / 10) / (num * 11)
  operacion <- round(operacion, digits = 5)
  print(operacion)
  ifelse(operacion < 0.1, "OK", "MAL")
}

valores_maquina(3)
# [1] 0.1
# [1] "MAL"