Qual é o menor número possível? – Programação Palavra do Dia

Marin Benčević
Marin Benčević

Siga

Agosto 7, 2018 · 5 min de leitura

Qual é o menor número maior do que 0? Esta é uma daquelas perguntas simples com respostas complicadas algures entre” não há nenhuma “e”depende”.

se você perguntar a um matemático, eles lhe dirão que não pode haver tal número porque quebraria a matemática. Se você tem um número n, onde n é o menor número depois de 0, então não pode haver um número n/2, porque n já é o menor. Isto significa que a própria divisão se desmorona, o que os matemáticos não gostam.

se você perguntar a um computador, você realmente terá uma resposta. Ao contrário do mundo real, os computadores não têm uma quantidade infinita de números porque simplesmente não cabiam. Os computadores armazenam números em registros de memória, e cada registro tem um número fixo de bits. Imagina se tivesses apenas três dígitos. O maior número que você poderia representar seria 999. Isto é o que acontece num computador.

isto significa que o conjunto de inteiros num computador é limitado pelo número de dígitos. Em um computador, há definitivamente um maior número (por exemplo, INT_MAX em C). É o número com a quantidade máxima de dígitos, todos os quais são definidos para um binário 1. Em um sistema de 8 bits, este número seria 11111111.

podemos complicar ainda mais as coisas, incluindo números negativos. Se tivermos 8 bits de dados, podemos usar o primeiro bit para representar o sinal do número. 0 for plus and 1 for minus. Agora temos 7 bits para os nossos dígitos, então o maior número é 011111111 que é menor do que o nosso número anterior maior.Ainda não acabámos. Também precisamos de representar números decimais. Mesmo que 0.12 seja um número pequeno, ele ainda tem três dígitos, como 123. A diferença é que há mais uma coisa em que precisamos pensar: o ponto decimal, também chamado ponto radix. Temos de armazenar os dígitos e a posição do ponto radix.

enquanto os inteiros são limitados em quão grandes podem ser, os números decimais são limitados em tamanho e precisão. Se você tem um número fixo de dígitos, há apenas tantos dígitos que você pode colocar após o ponto decimal. É por isso que os computadores precisam arredondar os números decimais.

como armazenamos estes números decimais, então? Os computadores só entendem inteiros, então precisamos de uma maneira de armazenar um número decimal apenas usando inteiros.

digamos que temos o número 3.14. Vamos começar por escrever todos os dígitos do número. Temos 314. É um começo. Sabemos que, multiplicando-se por potências de 10, podemos “mover” o ponto decimal em torno do número. 314 * 10^-1 é 31,4, enquanto 314 * 10^-2 é 3,14.

tudo o que precisamos para representar o número 3.14 é três inteiros: 314, 10 e -2. 314 é o que se chama significand, e estes são todos os dígitos do número escrito.

10 é chamado de radix ou base. Sabemos que, multiplicando-se com potências de 10, podemos mover o ponto decimal em torno dos números na base 10. O mesmo funciona para todas as bases de números: na base 2 (ou binária), você pode mudar o ponto multiplicando por potências de 2.

a potência por que passamos é chamada de expoente, e nos diz Onde está o ponto decimal.

pode escrever todos os números decimais como esses três números com uma fórmula simples:

number = significand * base^exponent3.14 = 314 * 10^-2
32.8 = 328 * 10^-1

um computador armazena um número decimal armazenando o sinal, o expoente e o significado em uma única cadeia de 32 ou 64 bits de dígitos. Normalmente há 1 bit para o sinal, 11 bits para armazenar o expoente e 53 bits para armazenar o significand, somando até 64.Com isso em mente, vamos voltar à nossa pergunta .: Qual é o menor número não-zero? Se tivermos apenas três dígitos a mais, o menor número possível é 0,01. Com quatro dígitos, é 0,001. Você vai notar um padrão aqui: o significado é sempre o mesmo, apenas as mudanças exponentes.

o que precisamos é de um significado de 1, porque é o menor depois de 0. Temos então de deslocar o ponto decimal o mais longe possível para a esquerda. Para isso precisamos do menor (mais negativo) expoente possível.

quão pequeno, depende do layout do número na memória. Se tivermos 11 bits para o expoente, só podemos escrever um número que tem 10 bits de comprimento, com 1 bit reservado para o sinal. Em um sistema de 64 bits o menor expoente é -308.

no final, o menor número possível em um sistema de 64 bits seria em torno de 1 * 10^-308. Isso é pequeno!

estabelecemos que existe um número menor. Este número diz-nos o quanto podemos confiar no nosso computador. Se você está fazendo algo que requer números muito grandes ou muito precisos, você precisa manter este número em mente.

o que acabamos de calcular é algo chamado de unidade no último lugar, ou ulp, de 0. Além de ser uma palavra muito legal, ulp nos diz qual é a distância mínima entre dois números em um computador. Calculamos o ulp de 0, que é a distância mínima entre 0 e o próximo número.

se você adicionar o valor calculado a 0 e tentar compará-los, eles não seriam o mesmo número. No entanto, se você adicionar um valor menor do que o ulp, ele ainda seria o mesmo número no que diz respeito ao computador.

print(0 == 0 + ulp(0)) // false
print(0 == 0 + ulp(0) / 2) // true

para nós é óbvio que a adição de um valor não-zero a um número irá produzir um número diferente, mas um computador tem que rodear em algum lugar, então ele não pode necessariamente dizer se dois números são os mesmos.

para comparar sistemas de computador mais facilmente, usamos o ulp de 1, e chamamos-lhe a máquina epsilon. Uma vez que você conhece a máquina epsilon, você pode calcular qualquer outro ulp com a seguinte fórmula:

ulp(x) = machine epsilon * radix^exponent(x)

o valor que calculamos é muito pequeno, então você provavelmente não vai atingir esse limite enquanto codifica. Mas calculámos o valor para 0. Com mais dígitos necessários para o lado esquerdo do ponto decimal, menos temos para o lado direito. Isso significa que quanto maior o número, menos precisão você tem. Em outras palavras, o ulp é uma função direta do expoente. À medida que você muda o ponto decimal para a direita, o ulp aumenta, e você perde precisão.

espero que esta informação vai ajudar você a próxima vez que você começar um estranho erro de ponto flutuante no seu código. Lembrem-se, os computadores são muito poderosos, mas até um computador tem os seus limites.



+