Programação C: Corrigindo Loops e Precisão de Ponto Flutuante em Tabelas de Conversão

4

Escrever um conversor de temperatura simples parece trivial até você perceber como a lógica básica quebra facilmente. Você começa com um loop while, cria uma tabela de Fahrenheit para Celsius e tudo parece bem. Mas então você precisa de um ponto de dados específico, como a temperatura do corpo humano, e de repente seu código limpo se transforma em um pesadelo de depuração.

Aqui está uma visão real de como o loop funciona em C, por que a precisão é importante e como impedir que seus programas sejam interrompidos para sempre.

O Básico: Loops Inteiros

Vejamos a versão mais simples possível. Você deseja imprimir uma tabela de 0 a 100 graus Fahrenheit, saltando 10s. Você usa um número inteiro int para o contador a.

Execute isso e você obterá uma grade limpa:

É funcional. É rápido. Mas é feio. Por que? Porque a divisão inteira trunca os decimais. (a - 32) * 5/9 elimina a parte fracionária antes de imprimir. Se precisar de precisão, você precisará de números de ponto flutuante.

Precisão de ponto flutuante

Mudar para float altera a matemática. Você também precisa trocar o especificador de formato de %d para %f. O código abaixo usa %6.2f, que instrui a impressora a reservar seis espaços, mantendo dois dígitos após a vírgula decimal.

Agora a saída tem casas decimais reais. Parece profissional. Mas e se você precisar de um valor específico que não se enquadre no padrão?

O bug da temperatura corporal

Imagine que você deseja inserir 98,6°F (temperatura normal do corpo humano) nessa tabela. Não chega a um múltiplo de 10. Então você adiciona uma instrução if.

Funciona para 100. Mas mude o limite do loop para 200 e a lógica entra em colapso. A condição if (a > 98.6) permanece verdadeira para cada iteração subsequente. Você imprimirá 98,6°F repetidamente.

Por que isso acontece? Porque a condição verifica se o número atual é maior que 98,6. Quando a atingir 100, será sempre maior que 98,6. Você não está verificando se acabou de passar. Você está verificando se está além disso.

A correção: estado de rastreamento

Para corrigir isso, você precisa se lembrar do valor anterior. Você introduz uma segunda variável, b, inicializada com -1.

Agora a lógica é sólida. Ele só imprime a linha extra se a estiver atualmente acima de 98,6 E b estiver anteriormente abaixo de 98

Artigo anteriorPor que a singularidade tecnológica pode realmente acontecer até 2030
Próximo artigoComo escolher o telefone mais seguro: equilibrando hardware, software e suporte