(Precisão de Float)
a) Escreva um programa que verifique a quantidade de casas decimais que podem ser representadas corretamente usando float (ponto flutuante de 32 bits).
b) Repita o experimento usando double (64 bits) e compare os resultados.
a) Escreva um programa que verifique a quantidade de casas decimais que podem ser representadas corretamente usando float (ponto flutuante de 32 bits).
b) Repita o experimento usando double (64 bits) e compare os resultados.
Passo 1
Beleza, o exercício pede pra gente descobrir, de maneira prática, quantas casas decimais (ou melhor, quantos dígitos decimais de precisão) o tipo
float
(32 bits) e o tipo double
(64 bits) conseguem representar certinho. Isso cai dentro de “ponto flutuante” e a ideia-chave é usar o conceito de épsilon de máquina (machine epsilon): o menor número ε tal que 1 + ε
seja diferente de 1
. A partir daí a gente converte esse ε em dígitos decimais.Pra resolver isso, vamos precisar de:
- Um laço que vá reduzindo ε até
1 + ε/2 == 1
(entendendo que aí ε é o menor passo que faz diferença). - A teoria de que o número de dígitos decimais ≃
.
Passo 2
Calcular o épsilon de máquina para
float
.- Começamos com
. - Enquanto
1.0f + ε_f/2 != 1.0f
, dividimospor 2.
Isso garante que a gente ache o menor valor que ainda faz1 + ε_f
exceder 1. - Quando o teste falhar,
é nosso épsilon de máquina para float
.
Teoria: em ponto flutuante, existe um “gap” mínimo entre 1 e o próximo valor maior. Esse gap é o épsilon de máquina.
Passo 3
Converter ε_f em dígitos decimais.
A fórmula aproximada é
A fórmula aproximada é
Explicando: se
, então a gente pode confiar em cerca de 7 dígitos decimais. O logaritmo em base 10 faz essa conversão de “tamanho do gap” para “quantidade de casas decimais”.
Passo 4
Repetir o mesmo para
double
.-
(tipo double). - Enquanto
1.0 + ε_d/2 != 1.0
, dividirpor 2. - Ao final,
é o épsilon de máquina do double
. - Calcular
Passo 5
Comparar os resultados:
- A gente vai ver que
é algo perto de , então . - Para
double
,fica em torno de , logo .
Resposta
float
(32 bits) representa corretamente cerca de 7 dígitos decimais.double
(64 bits) representa corretamente cerca de 16 dígitos decimais.