Ponto fixo vs número de ponto flutuante

109

Eu simplesmente não consigo entender os números de ponto fixo e ponto flutuante devido à dificuldade de ler definições sobre eles em todo o Google. Mas nenhum que eu li oferece uma explicação simples o suficiente do que eles realmente são. Posso obter uma definição simples com exemplo?

user942451
fonte
Também estou tendo problemas para encontrar uma boa definição. A principal coisa que procuro é algo que me ajude a entender esses resultados: 3,11 + 42,0 = 45,110001 (não 45,11), 3,12 + 42,0 = 45,119999 (não 45,12), 3,15 + 42,0 = 45,150002 (não 45,15).
Bart S.
1
Eu acho que esta é uma discussão relevante (especialmente descrevendo as armadilhas com números flutuantes e a melhor precisão com ponto fixo e por que você nunca iria querer descrever o dinheiro como um flutuante. Stackoverflow.com/questions/6320209/…
Andrew Norman
Link aleatório onde os tópicos são mencionados "OpenGL® ES OpenGL ES inclui perfis para sistemas de ponto flutuante e ponto fixo e a especificação EGL ™ ..."
The Red Pea

Respostas:

145

Um número de ponto fixo tem um número específico de bits (ou dígitos) reservados para a parte inteira (a parte à esquerda do ponto decimal) e um número específico de bits reservados para a parte fracionária (a parte à direita do decimal ponto). Não importa quão grande ou pequeno seja o seu número, ele sempre usará o mesmo número de bits para cada porção. Por exemplo, se seu formato de ponto fixo fosse decimal IIIII.FFFFF, o maior número que você poderia representar seria 99999.99999e o menor número diferente de zero seria 00000.00001. Cada pedaço de código que processa esses números deve ter um conhecimento integrado de onde está o ponto decimal.

Um número de ponto flutuante não reserva um número específico de bits para a parte inteira ou fracionária. Em vez disso, ele reserva um certo número de bits para o número (chamado de mantissa ou significando ) e um certo número de bits para dizer onde está a casa decimal (chamada de expoente ). Portanto, um número de ponto flutuante que ocupou 10 dígitos com 2 dígitos reservados para o expoente pode representar um maior valor de 9.9999999e+50e um menor valor diferente de zero de 0.0000001e-49.

Gabe
fonte
8
Bem, você está esquecendo que os números de ponto flutuante quase sempre são assinados, então o valor mínimo seria realmente -9.9999999e+50.
Brian Gordon,
4
Além disso, há polarização de expoente para que você possa representar muito mais valores discretos entre 0 e 1 do que entre 1.000.000 e 1.000.001. E há muitas complicações com operações de ponto flutuante que surgem, como garantir que você não relate 0 como a diferença entre dois números muito semelhantes quando a polarização não é suficiente para aumentar a precisão.
Brian Gordon,
28
@BrianGordon: Não esqueci os bits de sinalização; Ignorei-os intencionalmente para ter uma descrição simples e não ter que me preocupar com a diferença entre mínimo / máximo e menor / maior. Também deixei de fora intencionalmente a polarização de expoentes (que não tem nada a ver com o número de valores discretos entre quaisquer dois números), NaNs, infinitos, normalização, estouro negativo gradual, zeros com sinal, o fato de que a maioria dos flutuantes são binários (o que permite o primeiro bit da mantissa ser deixada de fora), e uma série de outros aspectos desnecessários para ilustrar o conceito.
Gabe
2
Por que o corte é para o número mínimo de pontos fixos 00000.00001? Estou esperando ver em 00000.00000vez disso. Além disso, você tem alguma referência que forneça mais detalhes sobre números de ponto fixo?
Nicholas Miller de
4
@NickMiller: Desculpe a confusão, mas eu estava falando sobre números diferentes de zero. Meu formato de exemplo pode representar 0, 0,00001, 0,00002, ..., 99999,99998, 99999,99999.
Gabe de
31

Um número de ponto fixo significa apenas que há um número fixo de dígitos após o ponto decimal. Um número de ponto flutuante permite um número variável de dígitos após o ponto decimal.

Por exemplo, se você tem uma maneira de armazenar números que requer exatamente quatro dígitos após o ponto decimal, então é um ponto fixo. Sem essa restrição, é um ponto flutuante.

Freqüentemente, quando o ponto fixo é usado, o programador realmente usa um número inteiro e então assume que alguns dos dígitos estão além do ponto decimal. Por exemplo, posso querer manter dois dígitos de precisão, então um valor de 100 significa na verdade 1,00, 101 significa 1,01, 12345 significa 123,45, etc.

Os números de ponto flutuante são de uso mais geral porque podem representar números muito pequenos ou muito grandes da mesma maneira, mas há uma pequena penalidade em ter que ter armazenamento extra para onde vai a casa decimal.

Vaughn Cato
fonte
2
o uso de ponto flutuante se torna um problema quando você começa a fazer cálculos com eles, por exemplo, se você adicionar um número de ponto flutuante realmente pequeno e um número muito grande. O resultado somado perde precisão porque deve representar um número com dois extremos e os decimais mais baixos são aparados (e não são arredondados).
Andrew Norman
2
também o uso potencial de valores expoentes em um ponto flutuante pode causar problemas com sistemas de computador que esperam números padrão
Andrew Norman
5

Do meu entendimento, a aritmética de ponto fixo é feita usando números inteiros. onde a parte decimal é armazenada em uma quantidade fixa de bits ou o número é multiplicado por quantos dígitos de precisão decimal são necessários.

Por exemplo, se o número 12.34precisar ser armazenado e precisarmos apenas de dois dígitos de precisão após o ponto decimal, o número será multiplicado por 100para obter 1234. Ao realizar matemática neste número, usaríamos este conjunto de regras. Somando 5620ou 56.20a este número resultaria 6854em dados ou 68.54.

Se quisermos calcular a parte decimal de um número de ponto fixo, usamos o operando módulo (%).

12,34 (pseudocódigo):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Os números de ponto flutuante são uma história completamente diferente na programação. O padrão atual para números de ponto flutuante usa algo como 23 bits para os dados do número, 8 bits para o expoente e 1, mas para o sinal. Veja este link da Wikipedia para mais informações sobre isso.

Sr. Goober
fonte
3

O termo 'ponto fixo' refere-se à maneira correspondente na qual os números são representados, com um número fixo de dígitos após, e às vezes antes, do ponto decimal. Com a representação de ponto flutuante, o posicionamento do ponto decimal pode 'flutuar' em relação aos dígitos significativos do número. Por exemplo, uma representação de ponto fixo com uma convenção de colocação de ponto decimal uniforme pode representar os números 123,45, 1234,56, 12345,67, etc, enquanto uma representação de ponto flutuante pode, além disso, representar 1,234567, 123456,7, 0,00001234567, 1234567000000000, etc.

user3553000
fonte
-6

Pegue o número 123.456789

  • Como um inteiro, este número seria 123
  • Como um ponto fixo (2), este número seria 123,46 (assumindo que você o arredondou para cima)
  • Como ponto flutuante, este número seria 123.456789

O ponto flutuante permite representar quase todos os números com grande precisão. Fixed é menos preciso, mas mais simples para o computador.

Sparky
fonte
11
A precisão com que você pode escrever um número não está relacionada ao fato de ser escrito em ponto flutuante, inteiro ou ponto fixo. Está relacionado ao número de dígitos significativos que você tem disponíveis. Por exemplo, INT_MAX é um número que pode ser representado exatamente como um int, mas não como um float porque eles não têm os 31 bits de precisão necessários para representá-lo exatamente.
Kian
1
fixed é o mais preciso, desde que seja dimensionado para lidar com o número em questão. Quando você faz matemática com números de pontos fixos, o arredondamento ocorre quando um cálculo tem um resto que excede o limite decimal. Com um ponto flutuante, você pode obter um valor muito impreciso se adicionar um número muito pequeno a um número muito grande. Quando isso ocorre, os dígitos são perdidos sem arredondamento
Andrew Norman
Isso é enganoso e errado. Ponto fixo significa que o número de dígitos após o ponto decimal é fixo. Não diz nada sobre a quantidade de precisão que possui.
Oscar Smith