Comment garder les conversions d'unités dans boost::unités en simple précision flotteurs?

0

La question

J'ai des alias pour les radians et les degrés que d'utiliser float comme type de stockage.

Quand je convertir entre ces deux unités, je vois l'assemblée promouvoir les valeurs de doubles et puis retour à flotteurs quand faire des conversions.

Q: Comment puis-je m'assurer que toutes les opérations et les conversions de rester dans la flotte?

Mon Code:

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); }

De compilateur explorer je vois la suite des instructions de montage: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Convertit un simple précision à virgule flottante valeur dans le “convertir-de la” source de l'opérande de double précision en virgule flottante valeur de l'opérande de destination.

  • mulsd - Multiplie le bas de double précision en virgule flottante valeur dans le deuxième opérande source, par le faible double précision en virgule flottante valeur dans le premier opérande source.

  • cvtsd2ss - Convertit un double-precision floating-point de la valeur dans le “convertir-de la” source de l'opérande de simple précision à virgule flottante valeur

PS: je ne serais pas surpris si j'ai défini mon alias ou/et de mes fonctions de conversion de manière incorrecte.

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

La meilleure réponse

1

J'ai trouvé un hacky solution de contournement (qui j'en suis sûr, peut être "productionized" en faisant de Stimuler les Unités de calcul du 57.x degrés par radian constante) pour éviter les conversions vers et à partir de doublemais il met en évidence le fait que Stimuler Unités est à l'origine une autre surprise de sorte que les coûts indirects: la mémoire des charges et les magasins qui ne sont pas nécessaires si vous utilisez float directement, ou même votre propre wrapper pour float.

Démo: https://godbolt.org/z/afPE7baxT

Ainsi, alors que le ci-dessus montre une (non raffiné) moyen de forcer les calculs de rester comme des flotteurs, si votre question est "Comment puis-je éviter la surcharge" vous êtes encore un peu loin du nirvana.

2021-11-23 10:46:36

malheureusement, en utilisant les angles ont été le minimum reproductible exemple dans la question de "Comment puis-je éviter la surcharge" puisque le problème s'applique à de nombreuses autres unités que j'ai besoin en tant que bien.
CJCombrink

@CJCombrink: Oui, ce que je veux dire c'est qu'il ressemble à éviter (tous) les frais généraux peuvent nécessiter un amerrissage forcé de Boost Unités, basé sur la démo que j'ai faite ci-dessus.
John Zwinck

Avoir un destructeur ou un constructeur de copie dans votre enveloppe peut provoquer ce suboptimality.
n. 1.8e9-where's-my-share m.

Dans d'autres langues

Cette page est dans d'autres langues

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