Ponto Flutuante e Ponto Fixo

Olá pessoal, estava assistindo uma entrevista com o Bill Gates e o Steve Jobs e eles entraram em um ponto que nunca prestei atenção, sou iniciante na programação java. Falaram de Ponto Flutuante e Ponto Fixo, não entendo o que é cada um e as diferenças e as semelhanças entre ambos. Procurei algum artigo no Google que poderia esclarecer minha duvida, mais infelizmente o que tinha não conseguiu me sastifazer satisfazer, procurei também artigos aqui no Guj, mais também, não fui muito feliz na minha busca. Queria que alguns de vocês me explicarem o que são os Pontos Flutuantes e os Pontos Fixo, e o que tem de diferença e semelhança entre eles.

ponto flutuante é usado para números não inteiros.

float numero=9.555;

agora ponto fixo eu nunca ouvi falar… o que vem a minha cabeça é um numero inteiro.

Os dois são para números fracionários.

No ponto fixo, você escolhe uma quantidade fixa de bits para representar a parte fracionária. (ou, em computação, você poderia dizer que, dos 32 bits que você usará para representar um número, 16 serão usados para a parte decimal e 16 para a fracionária).

No caso do ponto flutuante, você passa a ter uma quantidade variável de bits para a casa decimal e para a fracionária. O que ocorre é que você representa o número da seguinte forma:
valor x 2^-mantissa (Note que, no caso do computador, a base é 2, não 10. Mas usarei nos exemplos 10 pois é mais fácil para nós humanos).

Portanto, o número 10,5, nessa representação, seria representado como:
105 x 10^-1

Veja a um exemplo. Vamos supor que só podemos usar 10 dígitos para representar um número. Não mais, não menos.
Podemos usar esses dígitos como quisermos, mas não podemos gastar mais de 10. No caso do ponto fixo, poderíamos dizer que iremos usar 5 dígitos para a parte decimal e outros 5 para a parte fracionária:
Portanto, o maior número que poderíamos representar é 99.999,99.999.
O menor número decimal positivo seria 0,00001.

Se usassemos a estratégia de ponto flutuante, poderíamos dizer que temos 1 número para a mantissa, e os outros 9 para as casas decimais. Portanto, poderíamos representar o número inteiro:
999.999.999 x -10^0 (número: 999999999 mantissa: 0, note que não é necessário usar números para representar o -10, pois ele é sempre constante)

E o menor número decimal positivo seria:
1 x -10^9 (0,000000001)

Porém, em ponto flutuante, teríamos desvantagens se nossos números tivessem 5 casas antes da vírgula, e cinco depois, única situação em que o ponto flutuante é menos preciso nesse caso. Veja:
12345,12345 (ok, 5 casas antes, 5 depois)
123451234 x -10^4 (4 casas antes, 5 depois. Temos só 9 casas pois 1 casa é para mantissa (0))

As vantagens e desvantagens de cada um são:
Ponto fixo:

  • Menos preciso, porém, com precisão mais controlável;
  • Hardware mais barato

Ponto flutuante:

  • Mais preciso;
  • Representa muito melhor números inteiros;
  • Facilita a programação (implementações lidam mais facilmente com underflows, overflows, etc).

Algumas bibliotecas de física, como a Havok, utilizam aritmética de ponto fixo (ou podem ser configuradas para utilizar).
A razão é por objetivarem ser multiplataforma (a implementação é então feita em software e os arredondamentos feitos na mão, evitando que equipamentos diferentes façam cálculos diferentes, ao custo de performance).

No caso do ponto flutuante, hardware diferente pode apresentar precisão diferente. A razão disso é que alguns hardwares tem um processador especial para fazer os cálculos, com muitos bits de precisão (80 bits, por exemplo). Para evitar problemas de precisão em software multiplataforma que dependa muito de cálculo, o java implementou a diretiva strictfp. Nesse caso, os cálculos envolvendo a variável dispensam esse processador especial, e devem seguir as regras de precisão definidas pelo IEEE.

Você pode declarar uma variável como strictfp, ou mesmo uma classe inteira (assim, todas suas propriedades serão strictfp):

[code]public strictfp class MinhaClasse {
private float x;
private float y;

//etc.
}

public class Exemplo {
private strictfp float valor;
//etc.
}
[/code]