He visto intervalos de números representados como [first1, last1)
y [first2, last2)
.
Me gustaría saber qué significa esta notación.
He visto intervalos de números representados como [first1, last1)
y [first2, last2)
.
Me gustaría saber qué significa esta notación.
Un corchete - [
o ]
- significa que el final del rango es inclusivo -- incluye al elemento listado. Un paréntesis - (
o )
- significa que el final es exclusivo y no incluye el elemento listado. Por lo tanto, para [first1, last1)
, el rango comienza con first1
(y lo incluye), pero termina justo antes de last1
.
Suponiendo números enteros:
Eso es un intervalo semiabierto.
[a,b]
incluye los puntos finales.(a,b)
los excluye.En tu caso, el punto final al inicio del intervalo está incluido, pero el final está excluido. Esto significa que el intervalo es "primero1 <= x < último1".
Los intervalos semiabiertos son útiles en programación porque corresponden al común idioma para hacer bucles:
for (int i = 0; i < n; ++i) { ... }
En este caso i está en el rango [0, n).
El concepto de notación de intervalo aparece tanto en Matemáticas como en Ciencias de la Computación. La notación Matemática [
, ]
, (
, )
denota el dominio (o rango) de un intervalo.
Los corchetes [
y ]
significan:
Los paréntesis (
y )
significan:
Un intervalo con estados mixtos se llama "semicerrado".
Por ejemplo, el rango de enteros consecutivos de 1 a 10 (inclusive) se notaría así:
Observa cómo se usó la palabra inclusive
. Si queremos excluir el punto final pero "cubrir" el mismo rango debemos mover el punto final:
Para ambos extremos izquierdo y derecho del intervalo, en realidad hay 4 permutaciones:
(1,10) = 2,3,4,5,6,7,8,9 Set tiene 8 elementos
(1,10] = 2,3,4,5,6,7,8,9,10 Set tiene 9 elementos
[1,10) = 1,2,3,4,5,6,7,8,9 Set tiene 9 elementos
[1,10] = 1,2,3,4,5,6,7,8,9,10 Set tiene 10 elementos
¿Cómo se relaciona esto con Matemáticas y Ciencias de la Computación?
Los índices de los arreglos tienden a utilizar un diferente desplazamiento dependiendo del campo en el que te encuentres:
Estas diferencias pueden llevar a errores sutiles de "cerca del poste", también conocidos como errores fuera de por uno al implementar algoritmos Matemáticos como los bucles for.
Si tenemos un conjunto o arreglo, como los primeros primos [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
, los Matemáticos se referirían al primer elemento como el 1er
elemento absoluto. es decir, Usando la notación de subíndice para denotar el índice:
Algunos lenguajes de programación, en contraste, se referirían al primer elemento como el 0-ésimo
elemento relativo.
Dado que los índices de los arreglos están en el rango [0,N-1], para claridad sería "bueno" mantener el mismo valor numérico para el rango 0 .. N en lugar de agregar ruido textual como un sesgo de -1
.
Por ejemplo, en C o JavaScript, para iterar sobre un arreglo de N elementos un programador escribiría el idiom común de i = 0, i < N
con el intervalo [0,N) en lugar del ligeramente más largo [0,N-1]:
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 0; i < 10; i++ ) // [0,10)
output += "[" + i + "]: " + a[i] + "\n";
if (typeof window === 'undefined') // Comando Node
console.log( output )
else
document.getElementById('output1').innerHTML = output;
}
Los Matemáticos, dado que empiezan a contar en 1, usarían la nomenclatura i = 1, i <= N
pero ahora necesitamos corregir el desplazamiento del arreglo en un lenguaje basado en cero.
por ejemplo
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 1; i <= 10; i++ ) // [1,10]
output += "[" + i + "]: " + a[i-1] + "\n";
if (typeof window === 'undefined') // Comando Node
console.log( output )
else
document.getElementById( "output2" ).innerHTML = output;
}
Aparte:
En lenguajes de programación que son basados en cero puedes necesitar un apaño de un elemento ficticio de cero para usar un algoritmo Matemático basado en uno. por ejemplo, Comienzo de Índice en Python
La notación de intervalo también es importante para los números de punto flotante para evitar errores sutiles.
Cuando se trata de números de punto flotante, especialmente en Gráficos por Computadora (conversión de color, geometría computacional, interpolación / mezcla de animación, etc.) a menudo se usan números normalizados. Es decir, números entre 0.0 y 1.0.
Es importante conocer los casos límite si los extremos están inclusivos o exclusivos:
Donde M es algún épsilon de máquina. Por eso a veces verás el idiom de const float ÉPSILON = 1e-#
en código C (como 1e-6
) para un número de punto flotante de 32 bits. Esta pregunta en SO El uso de la variable épsilon tiene algunos detalles preliminares. para una respuesta más completa, mira FLT_ÉPSILON
y el artículo de David Goldberg Lo que Todo Informático Debería Saber Sobre Aritmética de Punto Flotante
Algunas implementaciones de un generador de números aleatorios, aleatorio()
pueden producir valores en el rango 0.0 .. 0.999... en lugar del más conveniente 0.0 .. 1.0. Comentarios adecuados en el código documentarán esto como [0.0,1.0) o [0.0,1.0] para evitar ambigüedades en el uso.
Ejemplo:
Quieres generar colores aleatorios()
. Conviertes tres valores de punto flotante en valores sin signo de 8 bits para generar un píxel de 24 bits con canales rojo, verde y azul respectivamente. Dependiendo del intervalo de salida por aleatorio()
podrías terminar con cerca del blanco
(254,254,254) o blanco
(255,255,255).
+--------+-----+ | aleatorio() | Byte |
---|---|---|
0.999... | 254 | <-- error introducido |
1.0 | 255 |
+--------+-----+
para más detalles sobre la precisión y robustez de los números de punto flotante con intervalos ve el libro de Christer Ericson Detección de Colisiones en Tiempo Real, Capítulo 11 Robustez Numérica, Sección 11.3 Uso Robusto de Punto Flotante.
Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.