Pregunta

Estoy trabajando en C para implementar un pseudocódigo que dice:

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

El floatDelay siempre será positivo. ¿Existe alguna ventaja al usar la función round de math.h:

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

o puedo usar:

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

Solución

Siempre debe usar las librerías de matemáticas apropiadas cuando se trata de números de punto flotante. Un flotador puede ser solo una aproximación muy cercana al valor real, y eso puede causar rareza.

Por ejemplo, 5f podría aproximarse a 4.9999999 ... y si intentas lanzar directamente a int, se truncará a 4.

Para ver por qué en profundidad, debes buscar números de punto flotante en wikipedia. Pero en resumen, en lugar de almacenar el número como una serie recta de bits como un int, se almacena en dos partes. Hay una " fracción " y un exponente, donde el valor final del flotador es la fracción * (exponente base ^).

Otros consejos

No conozco ninguna otra ventaja, aparte del hecho de que el elenco a int no puede ser inmediatamente obvio para otros programadores que funciona como un trunc ...

Mientras que con la función redonda, sus intenciones son claras.

Cualquiera de los dos está bien, siempre que digas que floatDelay es positivo.

Es posible que uno sea marginalmente más rápido que el otro, aunque sería difícil decir cuál de ellos sin un análisis comparativo, dado que round () es posiblemente implementado como un compilador intrínseco. Es incluso más probable que cualquier diferencia de velocidad sea abrumadoramente sin importancia, por lo que el uso que creas es más claro.

Encontré " Truncar un valor decimal en c ++ " proporcionó una discusión útil de los números de punto flotante.

En particular, Greg Hewgill proporcionó este enlace: Lo que todo científico de computación debería saber Aritmética de punto flotante por David Goldberg

  

Por ejemplo, 5f podría aproximarse a 4.9999999 ...   y si intentas lanzar directamente a int, se truncará a 4.

¿Es esto realmente cierto?

Si se asegura de que agrega el 0.5 antes de truncar a int,
es realmente 4.9999 un problema.

Quiero decir: 4.9999 + 0.5 = 5.4999 - > 5

/ Johan

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top