Cum să păstrați unitatea conversii în impuls::unități în single-precizie plutește?

0

Problema

Am pseudonime pentru radiani și de grade care folosesc pluti ca tip de stocare.

Când am converti între aceste două unități văd de asamblare a promova valorile duble și apoi înapoi la plutește atunci când faci conversii.

Q: Cum pot să mă asigur că toate operațiunile și conversii de ședere în plutește?

Codul Meu:

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

Din compiler explorer văd următoarele instrucțiuni de asamblare: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Convertește un singur precizie în virgulă mobilă valoare în "convertiți-de la" sursa operand la o dublă precizie în virgulă mobilă valoare operand destinație.

  • mulsd - Multiplică scăzut cu dublă precizie în virgulă mobilă valoare în cel de-al doilea operand sursă de joasă dublă precizie în virgulă mobilă valoare în primul operand sursă.

  • cvtsd2ss - Convertește o dublă precizie în virgulă mobilă valoare în "convertiți-de la" sursa operand de la un singur precizie în virgulă mobilă valoare

PS: eu nu aș fi surprins dacă am definit mea pseudonime sau/și mi funcții de conversie incorect.

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

Cel mai bun răspuns

1

Am găsit o minge de soluție (pe care sunt sigur că poate fi "productionized" de a face Boost Unități calcula 57.x grade pe radian constantă) pentru a evita conversii la și de la double, dar subliniază faptul că Stimularea Unități cauzează un alt surprinzător fel de regie: memorie sarcini și magazine care nu sunt necesare dacă utilizați float direct, sau chiar propriul înveliș pentru float.

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

Deci, în timp ce mai sus arată un (nerafinat) mod de a forța calcule să rămână ca pluteste, dacă întrebarea este "Cum pot evita aeriene" ești încă un pic mai departe de nirvana.

2021-11-23 10:46:36

din păcate, folosind unghiurile au fost minime reproductibile exemplu, în întrebarea "Cum pot evita aeriene" având în vedere că problema se aplică la multe alte unități de care am nevoie la fel de bine.
CJCombrink

@CJCombrink: Da, ce vreau să spun este că se pare ca evitarea (toate) regie ar putea necesita aruncat Impuls de Unități, bazat pe demo am facut mai sus.
John Zwinck

Având un destructor sau un constructor de copiere în ambalajul poate provoca acest suboptimality.
n. 1.8e9-where's-my-share m.

În alte limbi

Această pagină este în alte limbi

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