paulo1205
(usa Ubuntu)
Enviado em 29/10/2022 - 04:57h
fdabairros escreveu:
Agradeço o retorno, Marcelo.
Segue abaixo um trecho do script.
for indice in {1000000000000000000..1000000000000000000000..50000000000000000000}; do # valores na ordem de 1E18 e 1E21
#python3 teste.py $indice
done
O problema é que essa geração de valores incrementais na forma
{limite_inferior..limite_superior} é um recurso do
shell que utiliza aritmética de valores inteiros. Num PC de 64 bits, como os nossos PCs de uns quinze anos para cá, a representação de valores inteiros em 64 bits permite contar de
-2^63 (
-9223372036854775808, que é aproximadamente
-10^(18,6489)) até
+(2^63)-1 (
9223372036854775807), ou, se não forem usados números negativos, de
0 até
(2^64)-1 (
18446744073709551615, cerca de
10^(19,2659)).
Para usar valores fora dessa faixa, um programa ou linguagem de programação tem de usar uma técnica de representação de
big numbers, que consiste em usar múltiplas unidades de memória (quer sejam caracteres, bytes, valores de 64, 32 ou 16 bits, etc.) para representar partes do número, e realizar operações aritméticas com cada uma dessas partes individualmente (dependendo da operação), mas de uma forma que, na hora de exibir (ou de ler) o número completo, as diferentes partes são justapostas de modo adequado a representar o número inteiro.
Tal forma de trabalhar, por sinal, reflete a forma como a maioria de nós lida com números compostos por múltiplos algarismos. Lembra de quando a gente estudou, lá pela quarta série, sobre notação numérica posicional com um conjunto de algarismos fixos, e sobre unidade, dezena e centena, e sobre a classe simples, classe dos milhares, classe dos milhões etc.? Graças a propriedades de distributividade, associatividade, comutatividade das operações aritméticas, nós conseguimos trabalhar com números de múltiplos algarismos dividindo-os em blocos. Pois é: dá para programar o computador para “pensar” e realizar operações aritméticas do mesmo modo que nós.
O problema é que, quando comparadas com as operações usando a representação nativa do processador, operações com
big numbers tendem a ser muito mais lentas. Somando-se essa lentidão ao fato de que é raro ter de usar, no dia-a-dia da maioria das pessoas valores que, ao mesmo tempo, sejam muito grandes e necessitem de uma precisão unitária (ou fracionária) muito grande (o que é uma simples unidade, perto de 18 quintilhões?), o uso de
big numbers não é extremamente difundido entre as linguagens de programação e ferramentas comuns.
Sendo esta uma comunidade de C e C++, cumpre observar que nenhuma dessas duas linguagens define uma representação obrigatória de
big numbers. Para tais linguagens, o uso de
big numbers é possível através de bibliotecas externas, e é possível que diferentes bibliotecas usem diferentes representações internas e operações válidas, não necessariamente compatível com outras implementações.
Você mencionou Python. Se não me engano, Python é umas das linguagens que usam
big numbers nativamente. Outro colega nosso, ao longo desta discussão, mencionou a calculadora de precisão arbitrária — feita, portanto, com o propósito específico de não ficar limitada à precisão da máquina hospedeira —
bc, que é uma ferramenta tradicional em sistemas UNIX.
O trecho de
script que você mostrou tentaria usar o
shell para criar argumentos a serem passados para um programa em Python, executado dentro de um laço de repetição, uma vez a cada iteração. Uma vez que o Python tem
big numbers e o
shell não, você poderia considerar mover o laço de repetição para dentro do programa em Python que, de outro modo, seria executado pelo seu script.
Depois dessa explicação toda, no seu script, você está querendo contar de um quintilhão até um sextilhão em incrementos de 50 quintilhões. Por que você não corta dezoito zeros de cada um desses números, e faz um laço de repetição de um até mil em incrementos de cinquenta, e multiplica (ou, na verdade, concatena dezoito zeros) ao valor do contador na hora de usá-lo como argumento do que quer que você venha a chamar? (Note que essa sugestão final é um exemplo de como a gente pode facilitar a nossa vida pensando em termos de unidade, dezenas, centenas e de diferentes classes.)
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)