Avançar para o conteúdo principal

Números em vírgula (ponto) flutuante

Sabia que:

0.0000001 x 0.0000002 = 0.000000000000019999999999999997

??

(Clique nos anúncios para ajudar à produção de conteúdo, obrigado)


Se a matemática se considera uma ciência exacta, já o cálculo matemático em computadores por vezes tem as sua limitações.

Em números inteiros não há um problema aparente, nem nos decimais, mas quando estamos no campo dos números muito grandes ou muito pequenos, vêm acima as limitações do cálculo

Veja o exemplo, da soma de dois números decimais com "valor" na 7ª casa decimal:

number1 = 0.0000001

number2 = 0.0000002


O programa em Python para devolver a soma destes dois números seria:

sum = number1 + number2

print(sum)

E o resultado:

3e-07

É um resultado em número de vírgula flutuante, usando a notação científica. Assim mesmo percebemos que o resultado é 3 ... ou melhor 0.0000003 até aqui tudo bem. Agora se formatarmos o resultado da soma, a variável sum para que nos dê o resultado com a aproximação a 10 decimais, com o código:

print(" %6.10f " % sum)

O resultado é:

0.0000003000 

Que está correcto. O problema real começa a surgir quando ultrapassamos o limite de armazenamento que o computador tem para os números em vŕigula flutuante (e claro o resultado de operações entre eles). Estes números têm de ser convertidos do sistema decimal para o binário, e têm ainda a limitação intrínseca da capacidade de o computador armazenar:

O sinal do número

O expoente

A mantissa

Há limitações próprias das arquitecturas de 32 bits ou 64 bits, bem como das normas ou do tipo de máquina.

Assim se aumentarmos a representação do resultado da soma para 25 dígitos à direita da vírgula (ponto) obtemos agora:

0.0000002999999999999999864 

O que expõe as "fragilidades" ou limitações do cálculo por computador. Estes defeitos são uma moeda de troca para os milhões de cálculos por segundo que o computador pode realizar, usando o sistema binário e de vírgula flutuante.

Para reforçar a ideia, se multiplicarmos os dois números iniciais e a representação do resultado com dígitos o resultado da multiplicação é:

0.000000000000019999999999999997

Em outras situações como são por exemplo as representações de frações (infinitésimos) é um "problema" a ter em conta.

Obrigado.


Comentários

Mensagens populares deste blogue

C# - Viadutos Excel - ISPOL

C# - Viadutos Excel - ISPOL Ler dados do Excel e passar a informação para o ISPOL é um ganho de produtividade e organização. Desta vez, apresento uma utilidade que lê um ficheiro Excel, e transforma os dados para o menu de estruturas do ISPOL. Partindo de um Excel organizado, por pks eixos e espessuras da estrutura etc... como o seguinte: Elaborei um programita em CSharp: Este programa funciona em modo "DOS" não tem uma interface gráfica de janelas: O programa cria os ficheiros necessários, o Excel pode estar organizado por eixos, e o programa guarda um ficheiro para cada eixo: O resultado depois de abrir o ficheiro em ISPOL é o seguinte: Com as alterações ao projecto pode-se manter um ficheiro de apresentação e controlo em Excel.

Politica de privacidade das aplicações colocadas na Play Store do Google

Politica de privacidade das aplicações colocadas na Play Store do Google. As aplicações não recolhem qualquer dado do utilizador nem a armazenam ou partilham com terceiros. Não recolhem a localização nem a armazenam ou partilham com terceiros. Alguma informação sobre os utilizadores que possa chegar ao programador por via da Play Store, será tratada de acordo com toda a confidencialidade, e não fornecida a terceiros. Obrigado.

ISPOL CAD CSharp - Fila de estratigrafia nos perfis longitudinais

ISPOL CAD CSharp - Fila de estratigrafia nos perfis longitudinais No corrente exercício, foi necessário agilizar o desenho do texto das camadas nos perfis. fonte : https://www.youtube.com/watch?v=PBEX1SFv8hk O modo de apresentação dos perfis quilométricos para a SCiT assim o requere. O trabalho de copiar a informação da tabela de geotécnia de Curva Masa para o desenho, se feito de forma manual consome bastante tempo. E como estas tabelas costumam sofrer alterações ao longo do projecto é um ponto a favor de alguma programação. Esta poderia ser apenas a transformação de dados do Excel para o ISPOL. O objectivo final é transformar a tabela acima, numa informação gráfica como o exemplo genérico seguinte: No menu de Tablas de Textos do ISPOL, encontrei uma limitação de número de caracteres, o que impede a copia directa de informação do Excel para o ISPOL. Assim pensei em adicionar algo mais ao planeado na programação. No ISPOL coloca-se um marcador para cada intervalo, que depois em CAD se