Come mantenere le conversioni di unità in boost::quote in singola precisione galleggia?

0

Domanda

Ho alias radianti e gradi che utilizzano galleggiante come il tipo di storage.

Quando ho conversione tra questi due unità vedo l'assemblea promuovere i valori raddoppia e poi di nuovo al galleggia quando fa le conversioni.

Q: Come posso verificare che tutte le operazioni e le conversioni di soggiorno in galleggia?

Il Mio Codice:

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

Dal compilatore explorer vedo le seguenti istruzioni di montaggio: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Converte una singola virgola mobile con precisione il valore della “conversione-da” fonte operando in doppia precisione in virgola mobile valore nell'operando di destinazione.

  • mulsd - Moltiplica il basso a doppia precisione in virgola mobile valore del secondo operando origine dal basso a doppia precisione in virgola mobile valore del primo operando di origine.

  • cvtsd2ss - Converte una doppia precisione in virgola mobile valore in “la conversione-da” operando origine a una singola virgola mobile con precisione il valore

PS: non sarei sorpreso se ho definito il mio alias e/o le mie funzioni di conversione in modo non corretto.

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

Migliore risposta

1

Ho trovato un hacky soluzione (che sono sicuro che può essere "productionized", facendo Aumentare le Unità di calcolo 57.x gradi in radianti costante) per evitare le conversioni da e per doublema in realtà mette in evidenza il fatto che la Spinta Unità è causato da un'altra sorprendente sorta di sovraccarico: carico di memoria e negozi che non sono necessarie se si utilizza float direttamente, o anche il wrapper per float.

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

Così, mentre il sopra mostra uno (non raffinato) per calcoli di forza per rimanere come galleggianti, se la tua vera domanda è: "Come faccio a evitare un sovraccarico" sei ancora un po ' lontano dal nirvana.

2021-11-23 10:46:36

purtroppo utilizzando gli angoli sono stati la minima riproducibile esempio la domanda "Come faccio a evitare un sovraccarico" poiché il problema riguarda molte altre unità che ho bisogno.
CJCombrink

@CJCombrink: Sì, quello che sto dicendo è che sembra evitando (tutti) sovraccarico potrebbe richiedere l'ammaraggio Boost Unità, nella demo che ho fatto sopra.
John Zwinck

Avere un distruttore o un costruttore di copia nel wrapper può causare questo suboptimality.
n. 1.8e9-where's-my-share m.

In altre lingue

Questa pagina è in altre lingue

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