1
resposta

[Dúvida] Função abs() perde informações de casas decimais

Como relatado em um tópico anterior, a função abs() pode fazer com que ocorra um erro no programa ao calcular e registrar os pontos do jogador. Após fazer testes, percebi que a função abs(), quando utilizada, perde as informações de casas decimais das variáveis. Sendo assim, no código do jogo de adivinhação em questão, se a função abs() for utilizada após a divisão por "2", qualquer valor decimal registrado vai ser perdido.

...
    pontosperdidos=(chute-numerosecreto)/2.0;
    pontos=pontos-abs(pontosperdidos);
    //Neste caso os valores decimais serão perdidos
...

Para que o programa imprima possíveis valores decimais na pontuação é necessário usar a função abs() antes de ser feita a divisão por "2" (ou seja, antes que a conta possa resultar em um número com valores menor que um).

...
    pontosperdidos=abs(chute-numerosecreto)/2.0;
    pontos=pontos-pontosperdidos;
    //Neste caso os valores decimais dos pontos serão registrados
...

Gostaria de saber se existe uma função equivalente à função abs() mas que não perca informações sobre valores menores que um nas variáveis, podendo ser usada em qualquer das "posições" citadas. Obrigado.

1 resposta

Olá Pedro.

Resposta curta: fabs().

Documentação aqui.

Resposta longa:

O abs recebe um int e retorna o valor absoluto dele. Ele semelhante a:

int abs (int number)

Ao se passar um número com casas decimais num lugar que recebe inteiros, ele faz esse processo chamado de type narrowing, que resulta em perda de dados.

Dessa forma, na linguagem C, é necessário que haja uma função que recebe números com casas decimais e que o retorne o valor absoulto, sem fazer esse processo que causa perda. Por isso foi criado o fabs, que vem de float absolute.

Bons códigos e boas festas.