Jak zapisać konwersji jednostek w boost::jednostki miary w поплавках z jednej dokładnością?

0

Pytanie

Mam aliasy dla radianów i stopni, które używają float jako typ pamięci.

Kiedy конвертирую między tymi dwoma jednostkami, widzę, że montaż zwiększa wartości do podwójnych, a następnie ponownie do pływających po wykonaniu przekształceń.

Pytanie: Jak mogę upewnić się, że wszystkie operacje i konwersji pozostają w pływających wartościach?

Mój Kod:

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

W eksploratorze kompilatora widzę następujące instrukcje montażu: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Konwertuje wartość zmiennoprzecinkową pojedynczej precyzji w argumencie źródłowym "konwersji z" w wartości zmiennoprzecinkowych podwójnej precyzji w argumencie docelowym.

  • mulsd - Mnoży wartość zmiennoprzecinkowa niskie podwójnej precyzji w drugim argumencie źródłowym na wartość zmiennoprzecinkowa niskie podwójnej precyzji w pierwszym argumencie źródłowym.

  • cvtsd2ss - Konwertuje wartość zmiennoprzecinkowa podwójnej precyzji w argumencie źródłowym "konwersji z" w wartości zmiennoprzecinkowych pojedynczej precyzji

PS: nie zdziwię się, jeśli źle określił swoje pseudonimy lub/i funkcji konwersji.

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

Najlepsza odpowiedź

1

Znalazłem przebiegły obejście (który, jestem pewien, że można "uproszczenia", zmuszając jednostki doładowania obliczyć stałą 57.x stopni na radiany), aby uniknąć konwersji do i z doubleale to naprawdę podkreśla fakt, że bloki zwiększenia powodują jeszcze jeden niesamowity widok napowietrznych: pobieranie i przechowywanie pamięci, które nie są potrzebne, jeśli używasz float bezpośrednio lub nawet w swoim własnym folią do float.

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

Tak więc, choć powyższe pokazuje jeden (brązowy) sposób obliczenia pozostać pływającymi, jeśli twój prawdziwy pytanie "Jak uniknąć kosztów ogólnych", nadal trochę daleko od nirwany.

2021-11-23 10:46:36

niestety, korzystanie z kątów było minimalne powtarzalne przykład w pytaniu "Jak uniknąć kosztów ogólnych", ponieważ problem dotyczy i do wielu innych urządzeń, które również są potrzebne.
CJCombrink

@CJCombrink: Tak, chcę powiedzieć, że wydaje się, aby uniknąć (wszystkich) kosztów ogólnych, może trzeba zrezygnować z bloków zwiększenia, opierając się na demo, które zrobiłem powyżej.
John Zwinck

Obecność деструктора lub konstruktora kopiowania w swojej powłoce może spowodować taka неоптимальности.
n. 1.8e9-where's-my-share m.

W innych językach

Ta strona jest w innych językach

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