El algoritmo de búsqueda binario original en el JDK usaba enteros de 32 bits y tenía un error de desbordamiento si (low + high) > INT_MAX
( http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html ) .
Si reescribimos el mismo algoritmo de búsqueda binaria usando enteros (firmados) de 64 bits, ¿podemos suponer que low + high
nunca excederá INT64_MAX porque es físicamente imposible tener 10 ^ 18 bytes de memoria?
Cuando se usan enteros (con signo) de 64 bits para representar cantidades físicas , ¿es razonable suponer que no puede ocurrir un desbordamiento y desbordamiento?
design
algorithms
Siqi Lin
fuente
fuente
Respuestas:
La respuesta corta es no. Sin embargo, para algunas aplicaciones, su suposición podría ser correcta.
Suponiendo un int firmado, 2 ^ 63, con comas agregadas para mayor claridad, = 9,223,372,036,854,775,808. Entonces es aproximadamente 9 * 10 ^ 18. 10 ^ 18 es un "Exa".
Wikipedia dice "A partir de 2013, se estima que la World Wide Web alcanzó 4 zettabytes. [12]", que es 4000 Exabytes. Por lo tanto, la WWW es aproximadamente 400 veces más grande que 2 ^ 63 bytes.
Por lo tanto, hay al menos una cantidad física que es mucho mayor que un entero de 64 bits con signo (o sin signo). Suponiendo que sus unidades son bytes . Si sus unidades fueran algo mucho más grandes, como GigaBytes, entonces estaría bien, pero su precisión de medición sería baja.
Para otro ejemplo, considere galaxias lejanas. La galaxia de Andrómeda es en realidad una de las más cercanas, y está a 2.5 * 10 ^ 6 años luz de distancia. Si sus unidades fueran millas , eso sería 14.5 * 10 ^ 18, más de un entero con signo de 64 bits. Ahora, obviamente, depende de las unidades que use para sus mediciones, pero algunas galaxias están mucho más lejos que Andrómeda. ( El más conocido se encuentra a 13 * 10 ^ 9 LY de distancia ) . Dependiendo de la precisión que desee para su medición, podría desbordar un entero de 64 bits.
( Agregado ) Sí, las millas son una pésima unidad para la distancia astronómica. Una unidad más normal podría ser una Unidad Astronómica , aproximadamente 93 millones de millas. Usando esa unidad de medida, la galaxia más lejana conocida es aproximadamente 10 ^ 15 UA (si mis cálculos son correctos), lo que cabría en un int de 64 bits. Sin embargo, si desea medir también la distancia a la Luna, a los satélites en órbita cercanos, esa unidad es demasiado grande.
Un ejemplo más de la electrónica: el Farad (F), una unidad de capacitancia . Los condensadores grandes varían hasta 5kF. Y este número probablemente aumentará con el tiempo a medida que mejoren los automóviles híbridos, las "redes inteligentes", etc. Una vez puede medir capacitancias tan pequeñas como 10 ^ -18 F. Por lo tanto, el rango general en capacitancia "real" que podemos medir hoy es 5 * 10 ^ 21, mayor que un entero de 64 bits.
fuente
Ni siquiera necesita volverse cósmico cuando se trata de combinatoria. Hay 2 ^ 95 ofertas posibles en un juego de bridge y eso es un poco pequeño de la complejidad.
fuente
La cantidad física más relevante para su pregunta es la RAM de la computadora .
Windows Server 2012 admite hasta 4 TB de memoria física. Eso es 2 42 bytes. Si las capacidades de RAM continúan duplicándose cada año, entonces, en solo 17 años a partir de ahora, "Windows Server 2032" admitirá 2 62 bytes de memoria física, momento en el cual
low + high
alcanzará 2 63-2 y besará el número entero de 64 bits con signo máximo.Espero que ningún sistema crítico para la seguridad falle, suponiendo que 64 bits siempre serán suficientes.
Para un uso un poco más general, la cantidad física más relevante es el espacio de direcciones de memoria . (Es útil tener un espacio de direcciones mucho más grande que la memoria física, por ejemplo, poner muchas pilas en la memoria, todo con espacio para crecer). Las implementaciones x86-64 actuales admiten direcciones virtuales de 48 bits, por lo que solo tenemos 14 años antes de que estas CPU alcancen el límite de espacio de direcciones de 2 62 bytes.
Y luego está la memoria compartida distribuida "donde las memorias (físicamente separadas) se pueden direccionar como un espacio de direcciones (lógicamente compartido)".
fuente
0xFFFFFFFFxxxxxxxx
(es decir, la mitad superior ), por ejemplo, el sistema operativo o los controladores de dispositivo.No exactamente. Hay muchos números que son más grandes y más pequeños que eso, por eso tenemos números de coma flotante. Los números de punto flotante intercambian menor precisión para un mejor rango
En el ejemplo específico que citó, es muy poco probable que alguna vez necesite un número mayor que ese. 64 bits corresponden a aproximadamente 18 quintillones de elementos. Pero nunca digas nunca.
fuente
Su suposición no manejará cantidades físicas que solo pueden representarse mediante números de coma flotante. E incluso si decidió escalar todos los números, digamos multiplicando todos los números por 10000 (por lo que los valores siguen siendo enteros pero pueden representarse en diez milésimas), este esquema todavía falla para números muy cercanos a cero, por ejemplo, la masa de electrones (9.1094 * 10⎻³¹ kg).
Esa es una cantidad física muy real (y extremadamente pequeña) , aquí hay algunas más con las que tendrá problemas. Y si argumenta que no es una cantidad física real (aunque esté en kg), considere:
Entonces ves a dónde voy con esto. El último que no puedes manejar tampoco.
Por supuesto, podría tener un campo especial dentro del número para escalar una porción entera hacia arriba o hacia abajo por un multiplicador variable; Dios, ahora acabas de inventar el punto flotante.
fuente
Primero, respondería a la pregunta ¿qué valores físicos pueden / deberían estar representados por un número entero?
Entero es una representación de un número natural (y las diferencias entre ellos) en un sistema informático, por lo que aplicarlo a cualquier otra cosa está mal. Por lo tanto, invocar distancias u otras cantidades que pertenecen al dominio continuo no es un argumento. Para tales cantidades hay representaciones de números reales. Y siempre puede elegir una unidad grande arbitrariamente y ajustar cualquier valor con una precisión dada.
Entonces, ¿cuáles son los valores físicos que son números naturales y pueden desbordar un entero de 64 bits?
Puedo pensar en dos. Número de objetos físicos (como átomos) y niveles de energía en los que puede estar un sistema cuántico. Esas son dos cosas que son estrictamente enteras. Ahora, sé que puedes dividir un átomo, pero aún produce una cantidad entera y no puedes dividirlo indefinidamente. Ambos pueden superar fácilmente el rango de 64 bits de entero sin signo . El número de átomos es mayor, y un átomo puede estar en más de un estado de energía.
Si la información es física o no, es muy discutible. Yo diría que no lo es. Por lo tanto, no diría que la cantidad de información es algo físico. Entonces, no es la cantidad de RAM ni nada de eso. Si permitiera esto, entonces el número de átomos fácilmente supera este número, porque necesita más de un átomo para almacenar un bit con la tecnología actual.
fuente
Además de la respuesta de Jerry101, me gustaría ofrecer esta prueba muy simple y práctica para la corrección:
Suponga que asigna algo de memoria a través
malloc
de un SO de 64 bits. Supongamos que el asignador de memoria decide devolverle un bloque de memoria válido, del tamaño que solicitó, pero donde está configurado el bit 63.En otras palabras, supongamos que existen algunos entornos de programación en los que
0xFFFFFFFFxxxxxxxx
hay rangos de memoria legítimos a los que se puede devolver una llamadamalloc
.La pregunta es, ¿su código seguirá funcionando según lo previsto?
Cuando ocurre una situación análoga a los sistemas operativos de 32 bits, algunos programas no funcionan correctamente si se les da direcciones de memoria "en la mitad superior". Originalmente, se pensaba que dichas direcciones de memoria solo estaban disponibles para el código privilegiado (sistemas operativos, controladores de dispositivos y hardware periférico), pero debido a la restricción del espacio de direcciones de 32 bits, los proveedores de sistemas operativos decidieron poner a disposición parte del espacio reservado para aplicaciones que lo soliciten.
Afortunadamente, es poco probable que ocurra esta situación para los programas de 64 bits por un tiempo, al menos no en una década.
Cuando esa situación finalmente suceda, significa que los procesadores y sistemas operativos direccionables de 128 bits se habrían convertido en la corriente principal para ese momento, y que podrían proporcionar un "entorno de emulación de 64 bits" para permitir que esas "aplicaciones heredadas" funcionen bajo supuestos similares a los actuales sistemas operativos de 64 bits.
Finalmente, tenga en cuenta que esta discusión solo se centra en las direcciones de memoria. Un problema similar con las marcas de tiempo debe tomarse con más precaución, porque ciertos formatos de marcas de tiempo asignan muchos bits de precisión a los microsegundos y, por lo tanto, dejan menos bits disponibles para representar el tiempo en el futuro. Estos problemas se resumen en el artículo de Wikipedia sobre el problema del año 2038 .
fuente
Esta es una pregunta que debe hacer caso por caso. No debe usar una suposición general de que la aritmética de 64 bits no se desbordará, porque incluso cuando las cantidades correctas estén en un rango mucho menor, una fuente de datos maliciosa podría terminar dándole cantidades irracionales que podrían desbordarse, y es mejor ser preparado para esta situación que ser golpeado inesperadamente.
Hay algunos casos en los que tiene sentido escribir código que depende de un desbordamiento de números de 64 bits. La clase principal de ejemplo que conozco son los contadores, donde el contador se incrementa cada vez que se usa. Incluso a un ritmo de un incremento por nanosegundo (no práctico), llevaría más de un siglo desbordarse.
Tenga en cuenta que si bien al principio puede parecer "siempre incorrecto en principio" confiar en el "tiempo hasta el fallo" para la corrección de un sistema, lo hacemos todo el tiempo con autenticación / inicio de sesión. Dado el tiempo suficiente (para el forzamiento bruto), cualquier sistema de este tipo (ya sea basado en contraseñas, claves privadas, tokens de sesión, etc.) está roto.
fuente
¿Es POSIBLE que una cantidad física no se ajuste a 64 bits? Por supuesto. Otros han señalado contar el número de átomos en el sol o el número de milímetros para la próxima galaxia. Si dichos casos son relevantes para su aplicación depende de cuál sea su aplicación. Si está contando el número de artículos en un contenedor determinado en su almacén, 16 bits probablemente serían suficientes. Si está compilando estadísticas sobre la cantidad de personas en el mundo que cumplen varias condiciones, debe poder registrar miles de millones, por lo que necesitará más de 32 bits, momento en el que presumiblemente iría a 64 (como pocas computadoras tienen soporte incorporado para números de 37 bits, etc. Si esta es una aplicación química que cuenta moles por átomos, 64 bits no serán suficientes.
Técnicamente, el hecho de que hoy en día ninguna computadora tenga 2 ^ 64 bytes de memoria no significa necesariamente que un índice de matriz nunca podría ser más de 2 ^ 64. Existe un concepto llamado "matriz dispersa" donde muchos de los elementos de la matriz no se almacenan físicamente en ningún lugar, y se supone que dichos valores no almacenados tienen algún valor predeterminado como nulo o cero. Pero supongo que si está escribiendo una función para buscar una matriz o lista de algún tipo, y el tamaño del campo que está utilizando para mantener el índice en la matriz es más del doble de la dirección más grande posible, luego verificando si hay desbordamiento cuando agregar dos índices no sería estrictamente necesario.
fuente
No es razonable suponer que un entero de 64 bits puede contener todos los números. Múltiples razones:
El entero máximo y mínimo de 64 bits son números finitos. Para cada número finito existe un número finito más grande y más pequeño.
Los cálculos con números de 128 bits y 256 bits se utilizan actualmente en varios lugares. Muchos procesadores tienen instrucciones específicas que funcionan con enteros de 128 bits.
Hace 20 años, un disco de 1 GB se consideraba "grande". Hoy un disco de 1 TB se considera pequeño. Hace 20 años, las computadoras de escritorio promedio tenían aproximadamente 16 MB de RAM. Mi escritorio actual tiene más de 16 GB de RAM. El espacio en disco duro y la RAM han crecido exponencialmente en el pasado, y se prevé que crezca exponencialmente en el futuro. A menos que alguien pueda encontrar una muy buena razón por la que debería dejar de crecer, no tiene sentido suponer que se detendrá.
fuente