Jak udržet převody jednotek v boost::jednotky v single-precision plave?

0

Otázka

Mám aliasy pro radiánů a stupňů, které používají float jako typ úložiště.

Když jsem převod mezi těmito dvěma jednotkami vidím sestava podporovat hodnoty se zdvojnásobí, a pak zpět do plováky, když dělá konverze.

Q: Jak se mohu ujistit, že všechny operace a konverze pobyt v plováky?

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

Od kompilátoru explorer vidím následující montážní pokyny: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Převádí single-precision floating-point hodnoty v "převést-od" zdroje operandů na double-precision floating-point hodnoty v cílovém operandu.

  • mulsd - Násobí nízké double-precision floating-point hodnoty v druhý zdrojový operand nízkou dvojitou přesností plovoucí desetinnou čárkou hodnoty v první zdrojový operand.

  • cvtsd2ss - Konvertuje double-precision floating-point hodnoty v "převést-od" zdrojového operandu do single-precision floating-point hodnoty

PS: já bych neměl být překvapen, když jsem definoval své přezdívky nebo/a můj konverzní funkce nesprávně.

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

Nejlepší odpověď

1

Našel jsem hacky řešení (které jsem si jistý, že může být "productionized" tím, že Zvýší Jednotky vypočítat 57.x stupňů na radiány konstantní), aby se zabránilo konverze do a z double, ale je to opravdu poukazuje na skutečnost, že Posílení Jednotek je příčinou další překvapivý druh režie: paměti načte a obchodů, které nejsou nutné, pokud budete používat float přímo, nebo dokonce i své vlastní wrapper pro float.

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

Takže zatímco výše ukazuje jeden (nerafinovaný) způsob, jak donutit výpočty zůstat, jak plave, pokud je váš skutečnou otázkou je "Jak mohu vyhnout režii" jsi ještě trochu daleko od nirvány.

2021-11-23 10:46:36

bohužel pomocí úhlů byly minimální reprodukovatelné například v otázce "Jak mohu vyhnout režii", protože problém se týká i mnoha dalších jednotek, které potřebuji stejně.
CJCombrink

@CJCombrink: Jo, to, co říkám, je, že to vypadá, jako vyhýbání se (všechny) režie může vyžadovat nouzové Boost Jednotky, založené na demo jsem udělal výše.
John Zwinck

S destructor nebo kopie konstruktoru ve vašem wrapper může způsobit tento suboptimality.
n. 1.8e9-where's-my-share m.

V jiných jazycích

Tato stránka je v jiných jazycích

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