representan - ¿Cuándo se deben especificar los números enteros explícitamente?
numeros reales pdf (2)
El uso de 1L
etc. es programáticamente seguro, ya que es explícito en cuanto a lo que se entiende, y no depende de ninguna conversión, etc.
Al escribir código de forma interactiva, puede ser fácil detectar errores y corregirlos en el camino; sin embargo, si está escribiendo un paquete (incluso la base R
), será más seguro ser explícito.
Cuando considere la igualdad, el uso de números flotantes causará problemas de precisión. Consulte estas preguntas frecuentes .
La especificación explícita de enteros evita esto, como nrow
y length
, y los argumentos de índice para apply
return o require integers.
A menudo escribo código R donde pruebo la longitud de un vector, el número de filas en un marco de datos o las dimensiones de una matriz, por ejemplo, if (length(myVector) == 1)
. Mientras hurgaba en algún código R base, noté que en tales comparaciones los valores se expresan explícitamente como enteros, usualmente usando el sufijo ''L'', por ejemplo if (nrow(data.frame) == 5L)
. Los enteros explícitos también se usan a veces para argumentos de función, por ejemplo estas declaraciones de la función cor
: x <- matrix(x, ncol = 1L)
y apply(u, 2L, rank, na.last = "keep")
. ¿Cuándo deberían los números enteros especificarse explícitamente en R? ¿Hay consecuencias potencialmente negativas por no especificar números enteros?
Tu preguntaste:
¿Hay consecuencias potencialmente negativas por no especificar números enteros?
Hay situaciones en las que es probable que importe más. De Chambers Software para Análisis de Datos p193:
Los valores enteros se representarán exactamente como números "dobles" siempre que el valor absoluto del entero sea menor que 2 ^ m, la longitud de la parte fraccional de la representación (2 ^ 54 para máquinas de 32 bits).
No es difícil ver cómo si calcularas un valor, podría parecer un número entero, pero no del todo uno:
> (seq(-.45,.45,.15)*100)[3]
[1] -15
> (seq(-.45,.45,.15)*100)[3] == -15L
[1] FALSE
Sin embargo, es más difícil encontrar un ejemplo de tipeo explícito en un entero y hacer que no surja un número entero en la representación de punto flotante, hasta que entres en los valores más grandes que Chambers describe.