O algoritmo de pesquisa binária original no JDK usava números inteiros de 32 bits e apresentava um erro de excesso se (low + high) > INT_MAX
( http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html ) .
Se reescrevemos o mesmo algoritmo de pesquisa binária usando números inteiros de 64 bits (assinados), podemos assumir que low + high
nunca excederá INT64_MAX porque é fisicamente impossível ter 10 ^ 18 bytes de memória?
Ao usar números inteiros de 64 bits (assinados) para representar quantidades físicas , é razoável supor que o subfluxo e o excesso não ocorram?
design
algorithms
Siqi Lin
fonte
fonte
Respostas:
A resposta curta é não. No entanto, para alguns aplicativos, sua suposição pode estar correta.
Supondo um int assinado, 2 ^ 63, com vírgulas adicionadas para maior clareza, = 9.223.372.036.854.775.808. Portanto, são aproximadamente 9 * 10 ^ 18. 10 ^ 18 é um "Exa".
A Wikipedia diz que "em 2013, estima-se que a World Wide Web tenha atingido 4 zettabytes. [12]", ou seja, 4000 Exabytes. Portanto, a WWW é aproximadamente 400 vezes maior que 2 ^ 63 bytes.
Portanto, há pelo menos uma quantidade física muito maior que um número inteiro de 64 bits assinado (ou não assinado). Supondo que suas unidades sejam bytes . Se suas unidades fossem muito maiores, como GigaBytes, você ficaria bem, mas sua precisão de medição seria baixa.
Por outro exemplo, considere galáxias distantes. A galáxia de Andrômeda é na verdade uma das próximas, e fica a 2,5 * 10 ^ 6 anos-luz de distância. Se suas unidades fossem milhas , isso seria 14,5 * 10 ^ 18, mais do que um número inteiro assinado de 64 bits. Agora, obviamente, depende das unidades usadas para suas medições, mas algumas galáxias estão muito mais longe que Andrômeda. ( O mais conhecido está a 13 * 10 ^ 9 LY de distância. ) Dependendo da precisão desejada para sua medição, ele pode exceder um número inteiro de 64 bits.
( Adicionado ) Sim, as milhas são uma péssima unidade para distância astronômica. Uma unidade mais normal pode ser uma unidade astronômica , aproximadamente 93 milhões de milhas. Usando essa unidade de medida, a galáxia mais distante conhecida tem aproximadamente 10 ^ 15 UA (se minha matemática estiver correta), o que caberia em um int de 64 bits. No entanto, se você também quiser medir a distância da Lua aos satélites em órbita próximos, essa unidade é muito grande.
Mais um exemplo da eletrônica: o Farad (F), uma unidade de capacitância . Capacitores grandes variam de até 5kF. E esse número provavelmente aumentará com o tempo, à medida que os carros híbridos, as "redes inteligentes" etc. melhorarem. Uma vez que é possível medir capacitância tão pequena quanto 10 ^ -18 F. Portanto, o intervalo geral em capacitância "real" que podemos medir hoje é 5 * 10 ^ 21, maior que um número inteiro de 64 bits.
fonte
Você nem precisa se tornar cósmico quando a combinatória está envolvida. Existem 2 ^ 95 transações possíveis em um jogo de bridge e isso é um pequeno lado da complexidade.
fonte
A quantidade física mais relevante para sua pergunta é a RAM do computador .
O Windows Server 2012 suporta até 4 TB de memória física. Isso é 2 42 bytes. Se as capacidades de RAM continuarem dobrando a cada ano, em apenas 17 anos, o "Windows Server 2032" suportará 2 62 bytes de memória física, quando você
low + high
alcançará 2 63-2 e beijará o número máximo de 64 bits com sinal máximo.Espero que nenhum sistema crítico de segurança falhe, tendo assumido que 64 bits sempre serão suficientes.
Para um uso um pouco mais geral, a quantidade física mais relevante é o espaço de endereço da memória . (É útil ter um espaço de endereço muito maior que a memória física, por exemplo, colocar muitas pilhas na memória, todas com espaço para crescer.) As implementações atuais de x86-64 suportam endereços virtuais de 48 bits, portanto, temos apenas 14 anos antes que essas CPUs cheguem o limite de espaço de endereço de 2 62 bytes.
E então há memória compartilhada distribuída "onde as memórias (fisicamente separadas) podem ser endereçadas como um espaço de endereço (compartilhado logicamente)".
fonte
0xFFFFFFFFxxxxxxxx
(ou seja, a metade superior ), por exemplo, o sistema operacional ou os drivers de dispositivo.Não exatamente. Existem muitos números maiores e menores que isso, e é por isso que temos números de ponto flutuante. Números de ponto flutuante trocam menor precisão para melhor alcance.
No exemplo específico que você citou, é altamente improvável que você precise de um número maior que isso. 64 bits corresponde a aproximadamente 18 quintilhões de elementos. Mas nunca diga nunca.
fonte
Sua suposição não manipula quantidades físicas que só podem ser representadas por números de ponto flutuante. E mesmo que você decida dimensionar todos os números, digamos, multiplicando todos os números por 10000 (para que os valores ainda sejam inteiros, mas possam ser representados em dez milésimos), esse esquema ainda falhará para números muito próximos de zero, por exemplo, a massa de elétrons (9,1094 * 10⎻3 kg).
Essa é uma quantidade física muito real (e extremamente pequena) , eis mais algumas com as quais você terá problemas. E se você argumentar que essa não é uma quantidade física real (mesmo que seja em kg), considere:
Então você vê para onde estou indo com isso. O último que você não pode lidar também.
Obviamente, você poderia ter um campo especial dentro do número para escalar uma parte inteira para cima ou para baixo por um multiplicador variável; agora você acabou de inventar o ponto flutuante.
fonte
Primeiro, eu responderia à pergunta que valores físicos podem / devem ser representados por um número inteiro?
Inteiro é uma representação de um número natural (e diferenças entre eles) em um sistema de computador; portanto, aplicá-lo a qualquer outra coisa está errado. Portanto, invocar distâncias ou outras quantidades que pertencem ao domínio contínuo não é um argumento. Para tais quantidades, existem representações numéricas reais. E você sempre pode escolher uma unidade arbitrariamente grande e ajustar qualquer valor com uma determinada precisão.
Então, quais são os valores físicos que são números naturais e eles podem exceder o número inteiro de 64 bits?
Eu consigo pensar em dois. Número de objetos físicos (como átomos) e níveis de energia em que um sistema quântico pode estar. Essas são duas coisas que são estritamente inteiras. Agora, eu sei que você pode dividir um átomo, mas ele ainda produz uma quantidade inteira e você não pode dividi-lo indefinidamente. Ambos podem facilmente ultrapassar a faixa de 64 bits do número inteiro não assinado . O número de átomos é maior e um átomo pode estar em mais de um estado de energia.
Se a informação é física ou não, é muito discutível. Eu diria que não é. Portanto, eu não diria que a quantidade de informação é uma coisa física. Portanto, não é a quantidade de RAM ou algo assim. Se você permitir isso, o número de átomos facilmente ultrapassa esse número, porque você precisa de mais de um átomo para armazenar um pouco com a tecnologia atual.
fonte
Além da resposta de Jerry101, gostaria de oferecer este teste muito simples e prático de correção:
Suponha que você aloque alguma memória via
malloc
, em um sistema operacional de 64 bits. Vamos supor que o alocador de memória decida retornar para você um bloco de memória válido, do tamanho solicitado, mas onde o 63-bit é definido.Em outras palavras, vamos supor que existem alguns ambientes de programação em
0xFFFFFFFFxxxxxxxx
que intervalos de memória legítimos podem ser retornados de uma chamada paramalloc
.A questão é: seu código ainda funcionará como pretendido?
Quando a situação análoga ocorre nos sistemas operacionais de 32 bits, alguns softwares não funcionam corretamente se receberem endereços de memória "na metade superior". Originalmente, pensava-se que esses endereços de memória estivessem disponíveis apenas para o código privilegiado (sistemas operacionais, drivers de dispositivo e hardware periférico), mas, devido à restrição do espaço de endereço de 32 bits, os fornecedores de SO decidiram disponibilizar parte desse espaço reservado para aplicativos que solicitam isso.
Felizmente, é improvável que essa situação ocorra em programas de 64 bits por um tempo, pelo menos não em uma década.
Quando essa situação finalmente acontece, significa que os processadores e sistemas operacionais endereçáveis de 128 bits já teriam se tornado populares naquele momento e seriam capazes de fornecer um "ambiente de emulação de 64 bits" para permitir que esses "aplicativos herdados" operassem sob premissas semelhantes aos atuais sistemas operacionais de 64 bits.
Por fim, observe que esta discussão se concentra apenas nos endereços de memória. Um problema semelhante com registros de data e hora deve ser resolvido com mais precaução, porque determinados formatos de registro de data e hora alocam muitos bits de precisão aos microssegundos e, portanto, deixam menos bits disponíveis para representar o tempo no futuro. Esses problemas estão resumidos no artigo da Wikipedia sobre o problema do ano 2038 .
fonte
Essa é uma pergunta que você precisa fazer caso a caso. Você não deve usar uma suposição geral de que a aritmética de 64 bits não transbordará, porque mesmo quando as quantidades corretas estiverem em um intervalo muito menor, uma fonte de dados mal-intencionada pode acabar fornecendo quantidades irracionais que podem transbordar e é melhor preparado para esta situação do que ser atingido por ela inesperadamente.
Há alguns casos em que faz sentido escrever código que depende do não excesso de números de 64 bits. A principal classe de exemplo que eu conheço é contadores, onde o contador é incrementado cada vez que é usado. Mesmo a uma taxa de um incremento por nanossegundo (não prático), levaria mais de um século para transbordar.
Observe que, embora possa parecer "sempre errado em princípio" confiar no "tempo até a falha" para a correção de um sistema, fazemos isso o tempo todo com autenticação / login. Com tempo suficiente (para força bruta), qualquer sistema desse tipo (baseado em senhas, chaves privadas, tokens de sessão etc.) é quebrado.
fonte
É POSSÍVEL que uma quantidade física não caiba em 64 bits? Claro. Outros apontaram contar o número de átomos no sol ou o número de milímetros na próxima galáxia. Se esses casos são relevantes para o seu aplicativo depende de qual é o seu aplicativo. Se você estiver contando o número de itens em qualquer posição no seu armazém, 16 bits provavelmente serão suficientes. Se você estiver compilando estatísticas sobre o número de pessoas no mundo que atendem a várias condições, precisará gravar bilhões; portanto, precisará de mais de 32 bits; nesse momento, presumivelmente, passaria para 64 (como poucos computadores suporte interno para números de 37 bits, etc.). Se esta é uma aplicação química que conta moles de átomos, 64 bits não serão suficientes.
Tecnicamente, apenas porque hoje em dia nenhum computador possui 2 ^ 64 bytes de memória não significa necessariamente que um índice de matriz nunca possa ser superior a 2 ^ 64. Existe um conceito chamado "matriz esparsa", em que muitos dos elementos da matriz não são fisicamente armazenados em nenhum lugar, e supõe-se que esses valores não armazenados tenham algum valor padrão como nulo ou zero. Mas suponho que se você estiver escrevendo uma função para pesquisar em uma matriz ou lista de algum tipo, e o tamanho do campo que estiver usando para manter o índice na matriz for mais do que o dobro do maior endereço possível, em seguida, verifique se há excesso quando adicionar dois índices não seria estritamente necessário.
fonte
Não é razoável supor que um número inteiro de 64 bits possa conter todos os números. Múltiplas razões:
O número máximo e mínimo de 64 bits são números finitos. Para cada número finito, existe um número finito maior e menor.
Atualmente, os cálculos com números de 128 e 256 bits são usados em vários locais. Muitos processadores possuem instruções específicas que operam em números inteiros de 128 bits.
Há 20 anos, um disco de 1 GB era considerado "grande". Hoje, um disco de 1 TB é considerado pequeno. Há 20 anos, os desktops médios tinham cerca de 16 MB de RAM. Minha área de trabalho atual tem mais de 16 GB de RAM. O espaço no disco rígido e a RAM cresceram exponencialmente no passado e prevê-se que cresça exponencialmente no futuro. A menos que alguém possa apresentar uma boa razão para parar de crescer, não faz sentido supor que ela irá parar.
fonte