Pergunta

Eu estou trabalhando em C para implementar pseudo-código que diz:

delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay

O floatDelay será sempre positivo. Existe uma vantagem de usar a função rodada de math.h:

#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));

ou eu posso usar:

delay=(int)(64*(floatDelay - intDelay) + 0.5))
Foi útil?

Solução

Você deve sempre usar as bibliotecas matemáticas apropriadas ao lidar com números de ponto flutuante. Um flutuador pode ser apenas uma aproximação muito próxima do valor real, e que pode causar estranheza.

Por exemplo, 5F pode ser aproximado 4,9999999 ... e se você tentar lançar diretamente para int será truncado para 4.

Para ver por que em profundidade, você deve olhar para cima números de ponto flutuante em wikipedia. Mas em suma, em vez de armazenar o número como uma série reta de bits como um int, ele é armazenado em duas partes. Há uma "fração" e um expoente, onde o valor final do flutuador é fração * (base ^ expoente).

Outras dicas

Não há qualquer vantagem que eu saiba, além do fato de que o elenco para int pode não ser imediatamente óbvio para outros programadores que ele funciona como um trunc ...

Considerando que, com a função rodada, suas intenções são claras.

Ou é bom, desde como você diz floatDelay é positivo.

É possível que um é ligeiramente mais rápido do que o outro, apesar de que seria difícil dizer qual, sem aferição, uma vez que round() é muito possivelmente implementado como uma intrínseca compilador. É ainda mais provável que qualquer diferença de velocidade é esmagadoramente sem importância, então use o que você sente é mais clara.

Eu encontrei " truncar um valor decimal em C ++ " forneceu uma útil discussão de números de ponto flutuante.

Em particular Greg Hewgill forneceu este link: O que cada cientista computador deve saber sobre Floating-Point Arithmetic por David Goldberg

Por exemplo, 5F pode ser aproximado 4,9999999 ... e se você tentar lançar diretamente para int será truncado para 4.

Isto é realmente verdade?

Se você certifique-se a adicionar a 0,5 antes de truncar a int,
é realmente 4,9999 um problema.

Quer dizer: 4,9999 + 0,5 = 5,4999 -> 5

/ Johan

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top