Suponha que você precise representar os valores indicados nos itens abaixo em um programa escrito na Linguagem C. Indique o tipo de dado mais adequado para cada caso, explicando o porquê da escolha.
Temperaturas na escala Celsius de
com exatidão de
Temperaturas na escala Celsius de
Passo 1
O enunciado pede que eu escolha o tipo de dado em C mais adequado para representar temperaturas na escala Celsius no intervalo de
até
com exatidão de
.\n
Informações fornecidas:
Informações fornecidas:
- intervalo mínimo:
\n - intervalo máximo:
\n - passo/precisão desejada:
\n
Objetivo deste passo: deixar claro o que é pedido e quais dados tenho para decidir o tipo.
Passo 2
Vou transformar os requisitos em propriedades numéricas que orientam a escolha do tipo.\n
- Para trabalhar com precisão de
é útil pensar em uma escala inteira: multiplico as temperaturas por para que o incremento de vire incremento unitário. Assim defino a variável inteira auxiliar tal que
onde
é a temperatura em graus Celsius.\n
2) Aplicando isso às extremidades do intervalo: para e
obtenho
2) Aplicando isso às extremidades do intervalo: para
Portanto, na escala inteira preciso representar todos os valores inteiros de
até
.\n
3) Contagem de valores distintos (opcional para intuição): há valores possíveis — isto é pequeno.
3) Contagem de valores distintos (opcional para intuição): há
Passo 3
Agora identifico opções práticas em C e os critérios para escolher:
- tipos inteiros com escala fixa (fixed-point): armazenar
como inteiro (por exemplo int16_t,int,short). Vantagens: representação exata dos passos de, nenhuma imprecisão binária do ponto flutuante, comparações e incrementos exatos, geralmente menos memória e mais velocidade em sistemas embarcados. - ponto flutuante (
floatoudouble):floattem 24 bits de mantissa (~7 decimal dígitos) edoubletem 53 bits (~15 dígitos). Observação importante: o valoré exatamente representável em ponto flutuante binário (é ), e qualquer múltiplo inteiro de também é exatamente representável quando o inteiro multiplicador é pequeno o bastante. Assim, armazenar valores como floatoudoublefuncionaria sem perda exata para essa grade específica. Porém, operações aritméticas subsequentes podem introduzir pequenas imprecisões e o uso de ponto flutuante costuma ser mais custoso em termos de desempenho e memória em alguns ambientes.
Passo 4
Comparação prática e escolha do método:\n
- Fixed-point (escala por 2) com inteiro traz exatidão total para a malha
e é mais simples para comparação, ordenação, armazenamento em formatos compactos e transmissão. Também evita dependência da aritmética de ponto flutuante.\n - Float/double: aceitáveis e simples de entender, e para este caso particular (passo
) um floatarmazenará corretamente os valores exatos. Contudo, por robustez (por exemplo, se for necessário salvar, comparar ou fazer muitas operações inteiras) eu prefiro fixed-point.
Passo 5
Escolha do tamanho do inteiro (verificação de capacidade):\n
Preciso representar valores inteiros de entre
e
.\n
Preciso representar valores inteiros de
int16_t(tipo inteiro com sinal de 16 bits, definido em<stdint.h>) tem intervaloaté . Esse intervalo inclui confortavelmente a .\n int8_t(8 bits) tem intervaloa e seria insuficiente porque não cabe.\n - Poderia usar
intoushort, masint16_té explícito quanto ao tamanho e evita dependência de plataforma.\n
Logoint16_té suficiente e apropriado.
Passo 6
Como usar na prática (fórmulas e exemplos):\n
- Para armazenar uma temperatura
em graus Celsius (multiplo de ) faço
e guardo
s em uma variável do tipo int16_t.\n- Para recuperar o valor em graus (por exemplo para imprimir) uso
(observe que aqui divido por
para obter um valor em ponto flutuante na hora de mostrar).\n
Exemplos concretos:
Exemplos concretos:
-
(cabe em int16_t)\n -
\n -
\n
Assim todas as temperaturas possíveis mapeiam para inteiros entree , armazenáveis sem perda em int16_t.\n
Observação: se for necessário só armazenar e calcular com soma/subtração simples, essa abordagem evita qualquer erro de arredondamento.
Passo 7
Resumo dos prós e contras breves:\n
int16_tcom escala por 2 (fixed-point): precisão exata na grade de, menor uso de memória, operações inteiras exatas, portável quando usar <stdint.h>.\nfloat: também representaria exatamente os valores discretos aqui, mas traz possíveis pequenas imprecisões em operações e custo maior em alguns sistemas; aceitável se você preferir manipular temperaturas diretamente como números reais, mas menos robusto para comparações exatas.
Resposta
int16_t