Ako udržať jednotku konverzie v boost::jednotiek v jednom-presné pláva?

0

Otázka

Mám prezývky na radiány a stupňov, ktoré používajú float ako úložisko typu.

Keď som konverziu medzi týmito dvoma jednotkami vidím montáž podporovať hodnoty na dvojky a potom späť na plaváky, keď robí konverzie.

Q: Ako sa môžem uistiť, že všetky operácie a prevody pobyt v pláva?

Môj Kód:

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

Z kompilátor explorer som pozri nasledujúci návod na montáž: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Konvertuje single-precision floating-point hodnoty v "convert-z" zdrojový operand na double-precision floating-point hodnota v cieľovom operand.

  • mulsd - Násobí nízke double-precision floating-point hodnota v druhom zdrojový operand nízka double-precision floating-point hodnota v prvom zdrojový operand.

  • cvtsd2ss - Konvertuje double-precision floating-point hodnoty v "convert-z" zdrojový operand do jedného-precision floating-point hodnota

PS: ja by som nemal byť prekvapený, keď som definované moje prezývky alebo/a moje obrátenie funkcie nesprávne.

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

Najlepšiu odpoveď

1

Našiel som hacky riešenie (ktoré som si istý, že môže byť "productionized" tým Zvýšiť Jednotiek výpočet 57.x stupňov na rad konštanta), aby sa zabránilo prevody do a z double,, ale je to naozaj zdôrazňuje skutočnosť, že Zvýšenie Jednotky spôsobuje ďalšie prekvapujúce, triediť réžia: pamäte načíta a obchodov, ktoré nie sú potrebné, ak budete používať float priamo, alebo dokonca vaše vlastné wrapper pre float.

Ukážka: https://godbolt.org/z/afPE7baxT

Takže zatiaľ čo vyššie ukazuje, že jedna (nerafinovaný) spôsob, ako prinútiť výpočty na pobyt ako plaváky, ak je vaša skutočná otázka je "Ako sa môžem vyhnúť réžia:" ty sa ešte trochu ďaleko od nirvány.

2021-11-23 10:46:36

bohužiaľ pomocou uhlov boli minimálne reprodukovateľné príklad na otázku "Ako sa môžem vyhnúť réžii", pretože tento problém sa týka mnohých iných jednotiek, ktoré potrebujem ako dobre.
CJCombrink

@CJCombrink: Jo, to, čo hovorím je, že to vyzerá, vyhnúť (všetky) režijné náklady môžu vyžadovať núdzové pristátie na Podporu Jednotiek, založený na demo som urobil vyššie.
John Zwinck

S destructor alebo kópiu konštruktér vo vašom wrapper môže spôsobiť tento suboptimality.
n. 1.8e9-where's-my-share m.

V iných jazykoch

Táto stránka je v iných jazykoch

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