Cómo mantener la unidad de las conversiones en boost::unidades en precisión simple flota?

0

Pregunta

He alias para radianes y grados que el uso de flotación como el tipo de almacenamiento.

Cuando puedo convertir entre estas dos unidades veo la asamblea para promover los valores en dobles y, a continuación, volver a la flota al hacer las conversiones.

Q: ¿Cómo puedo asegurarme de que todas las operaciones y conversiones de estancia en los flotadores?

Mi Código:

using radians_f = boost::units::quantity<boost::units::si::plane_angle, float>;
using degrees_f = boost::units::quantity<boost::units::degree::plane_angle, float>;

degrees_f to_degrees(const radians_f& angle) { return static_cast<degrees_f>(angle); }
radians_f to_radians(const degrees_f& angle) { return static_cast<radians_f>(angle); }

Desde compilador explorer puedo ver las siguientes instrucciones de montaje: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Convierte un único punto flotante de precisión valor en el "convertir" a partir de" operando origen a un doble precisión de punto flotante de valor en el operando destino.

  • mulsd - se Multiplica la parte baja de doble precisión de punto flotante de valor en el segundo operando origen por la baja de doble precisión de punto flotante valor del primer operando origen.

  • cvtsd2ss - Convierte un doble precisión de punto flotante de valor en el "convertir" a partir de" operando origen a un solo punto flotante de precisión valor

PS: no me sorprendería si tengo definido mi alias o/y mis funciones de conversión de forma incorrecta.

boost boost-units c++ c++14
2021-11-23 10:02:53
1

Mejor respuesta

1

He encontrado un hacky solución (que estoy seguro de que puede ser "productionized", haciendo Aumentar las Unidades informáticas de la 57.x grados por radián constante) para evitar que las conversiones a partir de doublepero lo que realmente destaca el hecho de que el Impulso de las Unidades está causando otro sorprendente, una especie de sobrecarga: cargas de memoria y tiendas que no son necesarios si se utiliza float directamente, o incluso su propio contenedor para float.

Demo: https://godbolt.org/z/afPE7baxT

Así, mientras que la de arriba muestra una (sin refinar) obligar a los cálculos para permanecer como flotadores, si la verdadera pregunta es "¿Cómo puedo evitar sobrecarga" usted todavía está un poco lejos del nirvana.

2021-11-23 10:46:36

desafortunadamente el uso de ángulos fueron por la mínima reproducible ejemplo, en la pregunta de "¿Cómo puedo evitar sobrecarga" ya que el problema se aplica a muchas otras unidades que necesito así.
CJCombrink

@CJCombrink: Sí, lo que estoy diciendo es que se parece a evitar (todos) sobrecarga puede requerir de amaraje forzoso Impulso de Unidades, basado en la demo que hice referencia anteriormente.
John Zwinck

Tener un destructor o un constructor de copia en su envoltura puede causar este suboptimality.
n. 1.8e9-where's-my-share m.

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................