É razoável supor que qualquer quantidade física possa ser representada por um número inteiro de 64 bits sem excesso ou excesso?


31

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 + highnunca 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?


4
Observe qualquer fenômeno físico que tenha um número irracional associado. Círculos e pi, por exemplo. Os números de ponto flutuante são inerentemente racionais, portanto, você não pode representá-lo perfeitamente sem erros.
Thomas Eding

92
O número de átomos no sol é de aproximadamente 1,2e57, que se encaixa em um número inteiro sem sinal de 190 bits. Por contradição, 64 bits não podem ser grandes o suficiente para representar qualquer quantidade física.

6
O título da sua pergunta é enganoso. Você deve perguntar "existem quantidades para as quais se pode esperar um aplicativo usando uma matriz classificada de tamanho maior que 2 ^ 64?"
Doc Brown

7
ou o número de yoctosegundos desde que você começou a ler este comentário.
Jodrell

4
Houve um tempo em que todos pensavam que nunca haveria 2 ^ 32 computadores conectados um ao outro. Você não quer que seus átomos tenham que usar NAT, não é?
Sebb

Respostas:


58

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.


3
Tudo isso é verdade, mas, do ponto de vista prático, podemos questionar o ponto de medir a distância da galáxia de Andrômeda da Via Láctea em milhas (onde exatamente é o ponto de referência?) Ou a WWW inteira em bytes (nesta precisão, ele muda a cada milissegundo)
Jivan

45
@Jivan Do ponto de vista prático, não vejo razão para precisar de mais de 640kB de memória. Certamente é mais do que você NUNCA precisa.
ArTs

2
Outra desvantagem de medir distâncias astronômicas em quilômetros: você pode ser espancado com um gato.
Williham Totland

2
@ Jivan Bom ponto. Isso me lembra Richard Feynman reclamando da tolice de somar a temperatura de um grupo de estrelas. Entendo por que você desejaria a média, o mínimo, o máximo, mas a soma? Que significado físico é esse?
Piojo 24/02

6
@piojo - é certo que a soma é útil ao calcular a média.
Scott Whitlock

20

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.


Alguém pode se perguntar se isso conta como uma "quantidade física".
Paul Draper

2
Por outro lado, a combinatória envolvida em química ou matemática se qualificaria como "física".
Rwong

@PaulDraper se você tiver baralhos de cartas suficientes para fazer um layout no terreno, todos esses acordos serão físicos. Então você terá ainda mais de 2 ^ 95 cartões envolvidos.
25415 Brad

1
@ Brad, acho que o OP está pedindo uma quantidade que "existe" (ok, a existência é um conceito difuso). 2 ^ 95 cartas que satisfazem um conceito matemático não existem (chame Guinness se o fizerem). É difícil dizer o que "conta" e o que não conta. Esta resposta simplesmente não satisfaz minha noção mole de quantidade física.
Paul Draper

17

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 + highalcanç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)".


4
+1 Sua resposta está quase exatamente correta, exceto que certos tipos de software de hoje já estão encontrando endereços de memória na faixa de 0xFFFFFFFFxxxxxxxx(ou seja, a metade superior ), por exemplo, o sistema operacional ou os drivers de dispositivo.
Rwong

2
@SiqiLin provavelmente não no que diz respeito à computação pessoal. No entanto, a memória compartilhada distribuída ou o DGAS (mencionado no artigo) são reais; os supercomputadores operam nesse estilo há anos e é possível que ele se torne a norma para a infraestrutura multinacional de computação em nuvem. Aparentemente, o código de software típico escrito pelo programador típico não será executado nesse ambiente - ambientes incomuns executam softwares incomuns (ou seja, infraestruturais). Mas uma fração dos leitores de P.SE pode simplesmente seguir esse caminho de carreira; apenas no caso de.
Rwong

1
@ Josué: Com a tecnologia atual (32 GB DDR4), seriam 7m ou 23 ns para a luz viajar, o que parece perfeitamente alinhado com as modernas latências CAS. Se você empurrar para o extremo extremo do princípio do Landauer, com a densidade do silício você terá 31 nm ou 10 ^ -16 segundos para o limite físico. Isso não parece muito louco ... bem, talvez apenas um pouco.
Charles

3
@ Josué Esse é um limite tecnológico, não físico. (Como no caso, o problema é que não sabemos como fazê-lo na prática, não que algumas leis físicas o proíbam.) Portanto, apesar de relevante nesta semana, ela pode mudar a qualquer momento com alguma nova inovação. Cerca de 60 anos atrás, as pessoas teriam feito comentários muito semelhantes aos seus, cerca de 50 kilobytes de memória sendo considerados RAM, com o argumento de que as bobinas de fio enroladas à mão então usadas como partes de núcleos de memória não só podiam ficar tão pequenas e imóveis ainda , mas exigia espaço entre eles para evitar interferência EM.
Matthew Najmon

2
Lembro-me de quando 24 bits de espaço de endereço (16 megabytes) eram mais do que alguém jamais precisaria - ou poderia pagar. :-)
Bob Jarvis - Restabelece Monica

10

É razoável supor que qualquer quantidade física possa ser representada por um número inteiro de 64 bits sem excesso ou excesso?

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.


7

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:

10 kg (obviously physical quantity)
1 kg (same)
10⎻² kg (1/100 kg, or about 1/3 ounce) (also quite real)

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.


1
Mas você pode atribuir um valor físico mínimo (IIRC, para massa era a massa equivalente a 1 elétron-volt). Por exemplo, você pode medir o comprimento do universo usando unidades de comprimento de Planck com (IIRC) 200 dígitos. Você pode falar mentalmente de 1/10 de um comprimento de Planck, mas fisicamente não faz sentido.
SJuan76

Você não quer dizer dividir por 10000? Multiplicar por 10000 tornaria mais provável a suposição do abridor de threads. Talvez também meu dispositivo não exiba a massa de elétrons corretamente, mas deve ser 10 ^ -31 #
Mike Mike

Quero dizer multiplicar por 10000. Se você deseja armazenar 1.0001 como um número inteiro, é necessário multiplicá-lo por 10000 antes de armazená-lo como 10001. Eu estava usando caracteres sobrescritos para -31, talvez eles não sejam exibidos corretamente em todos os navegadores . Parece bem no Firefox.
tcrosley

@ SJuan76 Há algo chamado prova de futuro. Em 1850, poderíamos falar sobre uma unidade de 10 ^ -20 metros (muito menor que um átomo, mas ainda muito maior que o comprimento de Planck), mas fisicamente, isso não fazia sentido. Então as pessoas descobriram a estrutura interna de um átomo. Certamente, os quarks parecem fundamentais, mas tudo o que podemos dizer é: (a) eles agem de maneira consistente com o modo como esperamos que as partículas fundamentais se comportem; e (b) ainda não encontramos uma próxima tartaruga. Em 1850, poderíamos dizer as mesmas duas coisas sobre átomos. Se encontrarmos uma próxima tartaruga, unidades de 1/10 Planck se tornam bastante úteis.
Matthew Najmon

É um equívoco comum que espaço ou tempo são quantizados em unidades de Planck! Você não pode representar o universo por uma matriz quadridimensional, pelo menos não nas teorias atuais ... Portanto, frações dos comprimentos de Planck são fisicamente significativas (mas os resultados que saem da Relatividade Geral e / ou QM começam a explodir ou contradizendo-se).
yatima2975

5

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.


O conjunto N de números naturais inclui apenas números inteiros não negativos. Eu sei o que você quis dizer, mas "número natural" tem uma definição matemática específica inconsistente com a forma como você o está usando.

Eu não tenho tanta certeza. Tipos inteiros representam números naturais (dentro de um determinado intervalo de curso, o que está implícito). Isso não é verdade? Eu acho que você assumiu que eu implicava igualdade entre os conjuntos. Isso não é verdade, qualquer número natural pode ser representado por um número inteiro. Por favor, note que eu também disse diferenças entre eles. Não era necessário entrar / assinar / assinar. O tipo cantado é necessário apenas quando você lida com diferenças.
Luk32

Embora a fisicalidade das informações armazenadas seja discutível, e uma questão para os filósofos mais do que para os físicos, a fisicalidade dos mecanismos pelos quais elas são armazenadas é bastante certa. Portanto, enquanto a aplicabilidade a um número de bits de informação é questionável, o número de bits no valor de chips de memória RAM não é.
Matthew Najmon

@ MatthewNajmon É claro que concordo, foi por isso que deixei a última frase. O número de bits de um chip de RAM será menor que o número de átomos por algum tempo, para que você possa usá-lo. Em outras palavras, por que usar o número de bits, quando você pode usar o número de átomos do mesmo chip de RAM? Atualmente, um pouco de informação é representada por um estado em que um sistema físico está; portanto, você pode armazenar mais de um bit por átomo, mas está longe de ser aplicado atualmente e ainda não vejo como pode ser mais do que o número de estados quânticos de tal sistema. Mas eu concordo totalmente com sua premissa.
Luk32

4

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 0xFFFFFFFFxxxxxxxxque intervalos de memória legítimos podem ser retornados de uma chamada para malloc.

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 .


4

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.


2

É 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.


Bom ponto sobre matrizes esparsas. Além disso, mesmo com uma matriz totalmente preenchida, ainda é totalmente possível, embora um pouco lento e, em alguns casos, bastante necessário, trabalhar com uma matriz muito grande para caber toda a matriz na RAM de uma só vez. Isso é feito simplesmente armazenando tudo em um meio mais lento, mas muito maior, como um disco rígido e, em seguida, puxando para a RAM apenas os poucos elementos com os quais você está trabalhando no momento. Mesmo um pequeno HDD é grande o suficiente para armazenar uma matriz muito maior do que o OP está querendo assumir.
Matthew Najmon

0

Não é razoável supor que um número inteiro de 64 bits possa conter todos os números. Múltiplas razões:

  1. 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.

  2. 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.

  3. 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.