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

ISPOL - Representação de Gabaris

ISPOL - Representação de Gabaris No ISPOL podemos representar ao longo do traçado um contorno e até realizar variações. A representação de um contorno ou gabari pode ser realizada no ISPOL de um modo simples, usando por exemplo um Símbolo (bloco) da biblioteca, ou um ou vários criados à medida para atender aos casos necessários. Na imagem abaixo um exemplo da biblioteca do ISPOL, representado no perfil transversal. Estas secções são constituídas por símbolos/blocos: Podem-se desenhar ao longo do eixo proporcionando a vista típica destas situações, uma espécie de sólido que enche o traçado. Além desta representação "simples" o ISPOL permite realizar transições entre símbolos diferentes, por exemplo para representar os diferentes gabaris em recta e curva. Ou outras situações que se achem necessárias. Permite ainda condicionar a representação destes símbolos por valores de raio. Isto é para um determinado raio. Pode ser usado para indicar de forma automática ao programa que em r...

Python - Automatização em ISPOL

Python - Automatização em ISPOL Com o uso de PyAutoGui podemos automatizar tarefas repetitivas no ISPOL ISTRAM. No trabalho actual, é necessário converter mais de 300 ficheiros. Já houve um trabalho prévio de ler e transformar dados de directrizes em Excel para ficheiros compatíveis com a conversão presente. Este trabalho prévio foi também feito com programação. Tendo os muitos ficheiros com formato TXT que o ISPOL pode ler e converter para CEJ, é necessário ir ao menu de Conversores do ISTRAM e digitar os dados para ler a localização dos ficheiros, número de eixo etc... um trabalho repetitivo. Sendo repetitivo uma hipótese que deve surgir é se existe forma de automatizar / programar. O ISTRAM ISPOL não permite o uso de plugins (como o CAD), por tanto a via seria pela automatização dos movimentos. O pacote PyAutoGUI para Python permite esta simulação de movimentos. https://pyautogui.readthedocs.io/en/latest/ Basicamente "guiamos" o cursor para onde deve clicar e o que introdu...

Python - Pequena compilação de ferramentas para engenharia civil

Python - Pequena compilação de ferramentas para engenharia civil Desta vez algo relacionado com Python, linguagem que não uso de momento, aplicada à àrea da Engenharia Civil. A linguagem de programação Python, é tida como relativamente fácil de aprender, e por ter várias bibliotecas para manipular grandes quantidades de informação, cálculos e outras ferramentas, muitas. Aqui ficam exemplos e um incentivo a incorporar a programação no fluxo de trabalho. Cálculo de forças, estruturas. No site Medium o utilizador AP exemplifica um cálculo, usando a biblioteca sympy. https://medium.com/@arihantparsoya/solving-truss-problem-using-sympy-matrix-stiffness-approach-de02bd111517 Scripts para Autocad No site supplychaindataanalytics como em muitos outros, mostra um exemplo de aplicação do Pyautocad.  https://www.supplychaindataanalytics.com/python-for-autocad-pyautocad-module/ Grandes quantidades de informação No site geeksforgeeks como em muitos outros, exemplifica-se o uso do...