Vírgula flutuante (original em alemão Gleitkomma ou Fließkomma) ou ponto flutuante (do inglês floating point) é um formato de representação digital de números racionais, que é usada nos computadores.

História Vários estudiosos contribuíram para a história da virgula flutuante, dentre eles, Leonardo Torres y Quevedo, que, em 1914 projetou uma versão eletromecânica da Máquina Analítica de Charles Babbage, e nela incluiu a aritmética de ponto flutuante. Já Konrad Zuse de Berlim, em 1938, completou o Z1, o primeiro binário programável em um computador mecânico. A representação que ele utiliza é de número de ponto flutuante binário de 24 bits com um expoente assinado de 7 bits, um significando (incluindo um bit implícito) e um bit de sinal. O binário Z3 foi concluindo em 1941 e tem representações para infinitos positivos e negativos; em particular, ele implementa operações definidas com infinito, como 1/ ∞ = 0 ,e para em operações indefinidas, como 0 x ∞. miniaturadaimagem|Konrad Zuse, arquiteto do computador Z3, que usa uma representação de ponto flutuante binário de 22 bits. Konrad Zuse também propôs o Z3, mas não completou. A aritmética de ponto flutuante cuidadosamente arredondada que incluem ± ∞ e representações NaN, antecipando recursos do IEEE que foi padrão por quatro décadas. Por outro lado, von Neumann recomendou contra números de ponto flutuante para a máquina IAS 1951, argumentando que a aritmética de ponto fixo é preferível.

O primeiro computador comercial com hardware de ponto flutuante foi o Z4 da Zuse. Foi projetado em 1942-1945. Em 1946, Bell Laboratories introduziu o Mark V, que implementou números de ponto flutuante decimal.Randell, Brian , ed. (1982) . The Origins of Digital Computers: Selected Papers (3 ed.). Berlim; Nova York: Springer-Verlag . p. 244. ISBN 978-3-540-11319-5.

O Pilot ACE, um dos primeiros computadores construídos no Reino Unido, tem aritmética de ponto flutuante binário, e tornou-se operacional em 1950 no National Physical Laboratory. Após sua produção, trinta e três dele foram vendidos comercialmente como o Inglês Elétrico DEUCE. A aritmética nesses computadores era implementada em software, mas com uma taxa de tempo de um megahertz, a velocidade do ponto flutuante e do ponto fixo nas operações dessa máquina foram inicialmente mais rápidas do que as de muitos computadores concorrentes

O IBM 704, foi um computador desenvolvido para cálculos de larga escala, primordialmente para fins comerciais. Começou a ser produzido em massa em 1954. Décadas depois, o hardware de ponto flutuante era tipicamente um recurso opcional e os computadores que os possuíam foram chamados de "computadores científicos", ou ter capacidade de "computação científica" (SC). Somente a partir do lançamento do Intel i486, em 1989, que os computadores pessoais de uso geral tiveram capacidade de ponto flutuante em hardware como um recurso padrão.

A série UNIVAC 1100/2200, introduzida em 1962, suportava duas representações de ponto flutuante:

Precisão simples: 36 bits, organizado como um sinal de 1 bit, um expoente de 8 bits e um significando de 27 bits. Precisão dupla: 72 bits, organizado como um sinal de 1 bit, um expoente de 11 bits e um significando de 60 bits.

O IBM 7094, que também foi lançado em 1962, suporta representações de precisão simples e dupla, mas sem relação com às representações da UNIVAC. Em 1964, a IBM introduziu as representações de ponto flutuante hexadecimal em seu System / 360, unidades centrais de processamento, e elas ainda estão disponíveis para uso em sistemas z / Architecture modernos. No entanto, em 1998, a IBM incluiu aritmética de ponto flutuante binário compatível com IEEE em seus mainframes, gabinete principal que alojava a unidade central de processamento nos primeiros computadores. Em 2005, a IBM também adicionou IEEE-aritmética de ponto flutuante decimal compatível.

Inicialmente, os computadores usaram muitas representações diferentes para números de ponto flutuante. A falta de padronização no nível de mainframe era um problema contínuo no início dos anos 1970 para aqueles que escreviam e mantinham código-fonte de nível superior. Esses padrões de ponto flutuante do fabricante diferiam nos tamanhos das palavras, nas representações e no comportamento de arredondamento e precisão geral das operações.

A compatibilidade de ponto flutuante em vários sistemas de computação precisava desesperadamente de padronização no início de 1980, levando à criação do padrão IEEE 754, uma vez que a palavra de 32 bits (ou 64 bits) tinha se tornado comum. Este padrão foi significativamente baseado em uma proposta da Intel, que estava projetando o i8087 coprocessador numérico. A Motorola, que estava projetando o 68000 na mesma época, também deu uma contribuição significativa.

Em 1989, o matemático e cientista da computação William Kahan foi homenageado com o Prêmio Turing por ser o principal arquiteto por trás dessa proposta. Ele foi auxiliado por seu aluno (Jerome Coonen) e um professor visitante (Harold Stone).

Entre as inovações do x86 estão:

Uma representação de ponto flutuante precisamente especificada no nível da string, cadeia de caracteres, de bits de modo que todos os computadores compatíveis interpretarem padrões de bits da mesma maneira. Isso torna possível transferir com precisão e eficiência do ponto flutuante números de um computador para outro (após considerar a extremidade). Um comportamento precisamente especificado para as operações aritméticas: um resultado deve ser produzido como se infinitamente aritmética precisa foi usada para produzir um valor que é então arredondado de acordo com regras específicas. Isso significa que um programa de computador compatível sempre produziria o mesmo resultado quando dado uma entrada particular, mitigando assim a reputação quase mística que a computação de ponto flutuante desenvolveu para seu até então comportamento aparentemente não determinístico. A capacidade de condições excepcionais (estouro, divisão por zero, etc.) de se propagar por meio de um cálculo em um de maneira benigna e, em seguida, gerenciado pelo software de maneira controlada.

Generalidades Ao falar em números reais a visualização vinda à cabeça é:

Representação de um número fracionário.

No entanto, essa representação custa caro, em termos de processamento e armazenamento ao computador havendo a necessidade de utilizar uma outra maneira que favoreça tais tarefas. Para trabalhar com a parte fracionária de forma satisfatória, usa-se a representação por vírgula flutuante.

Essa representação baseia-se no deslocamento da vírgula de forma que se obtenha um número menor ou próximo de 1. Esse deslocamento é feito por meio de notação científica. Esclarecendo: o número 25,456 em notação corresponde ao 0,25456 x 102.

O exemplo acima tinha como base a decimal, no entanto o computador trabalha com a base 2 (binários – 0 e 1). Então um número binário 11,011 em notação corresponde ao 0,11011 x 22. Esse processo de transcrever um número em notação científica recebe o nome de normalização, portanto 0,11011 x 22 está normalizado.

De forma geral, representa-se um número em vírgula flutuante da seguinte forma: +- M X B+-e Onde: M é a mantissa (parte fracionária) B é a base e é o expoente Esquematicamente tem-seProf. MSc. Steinmacher,Igor, 2009, Imagem esquemática do Slide sobre Representação de Dados-Pontos Flutuantes:

Desta forma é possível cobrir um largo espectro de números, maximizando o número de bits significativos e consequentemente a precisão da aproximação. Esta forma de representação foi criada por Konrad Zuse para os seus computadores Z1 (1937) e Z3 (1941), batizada, então, de Gleitkommazahl (literalmente número com vírgula escorregante).

O número de bits alocados para representar a mantissa e o expoente depende da norma utilizada.

Para obter o número em vírgula flutuante converte-se o número para a base na qual será armazenado, normaliza-o e por fim separa-se mantissa, expoente e sinais.

ExemploProf. MSc. Steinmacher, Igor, 2009, Exemplo retirado do Slide sobre Representação de Dados-Pontos Flutuantes:

Assumindo: 1 bit para o sinal do número 1 bit para o sinal do expoente 4 bits para o expoente 10 bits para a mantissa Represente o número 5,7510 em vírgula flutuante. O número em questão encontra-se na base 10, portanto é preciso convertê-lo para binário (base 2), base entendida pelo computador. 5,7510 => 101,112

Normalizando tem-se: 0,10111 x 23

Separando sinais, mantissa e expoente tem-se: Sinal do número: (+) 0 Sinal do expoente: (+) 0 Expoente: 011 (3) Mantissa: 10111 Portanto tem-se: 00001100000101112

A maioria dos sistemas que operam com vírgula flutuante utilizam representações definidas na norma IEEE 754.

O padrão IEEE para aritmética de vírgula flutuante (IEEE 754) é o padrão mais amplamente utilizado, e é seguido por muitos CPU e melhorias FPU. A norma define formatos para representar números de vírgula flutuante (incluindo zero) e os valores não normalizados, bem como os valores especiais infinito e NaN, com um conjunto de operações de vírgula flutuante que trabalham com esses valores. Também especifica quatro modos de arredondamento e cinco exceções (inclusive quando essas exceções ocorrem é o que acontece nesses momentos). A Norma IEEE 754-2008 define os formatos adequados para representar números em vírgula flutuante de precisão simples (32 bits) e de precisão dupla (64 bits). O título completo da norma é o padrão IEEE para Aritmética Binária de Vírgula Flutuante (ANSI / IEEE Std 754-1985), e também é conhecido pelo IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems (originalmente o número de referência era IEC 559:1989).http://pubs.opengroup.org/onlinepubs/009695399/frontmatter/refdocs.htmlhttp://www.ajdesigner.com/fl_ieee_754_word/ieee_32_bit_word.php

O formato de vírgula flutuante de precisão simples (32 bits) consiste num bit de sinal (s), 8 bits de expoente (e) e uma mantissa de 23 bits (m). O bit de sinal (s) é 0 (zero) para números positivos e 1 para números negativos. O campo de expoente (e) corresponde à soma de 127 com o expoente de base 2 do número representado. O campo de mantissa (m) corresponde à parte fracionária da mantissa do número representado. Considera-se sempre a mantissa normalizada entre 1 e 2. Desta forma a sua parte inteira é sempre apenas um bit igual a 1 (um) que não é necessário representar.

v = S × M × 2E

Onde:

S = 1 − 2 × s

M = 1.m = 1 + m × 2−23

E = e − 127

+ Vígula flutuante de precisão simples de 32 bits segundo o IEEE 754 sinal (1 bit)expoente (8 bits) mantissa (23 bits)   ┃ ┌────────────────────┐ ┌─────────────────────────────────────────────────────────────────┐  0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  31 30 23 22 0

Números representáveis, conversão e arredondamento Por sua natureza, todos os números expressos em formato de ponto flutuante são números racionais com uma expansão terminante na base relevante (por exemplo, uma expansão decimal terminante na base-10, ou uma expansão binária terminante na base-2). Números irracionais, como π ou √2, ou números racionais não terminativos, devem ser aproximados. O número de dígitos (ou bits) de precisão também limita o conjunto de números racionais que podem ser representados exatamente. Por exemplo, o decimal número 123456789 não pode ser exatamente representado se apenas oito dígitos decimais de precisão estiverem disponíveis (seria arredondado para 123456790 ou 123456780 quando o dígito 0 mais certo não está explicitamente representado), o mesmo se aplica a dígitos não terminativos (0,5 a ser arredondado para .55555555 ou .5555556).

Modos de arredondamento