Как сохранить преобразования единиц измерения в boost::единицы измерения в поплавках с одной точностью?

0

Вопрос

У меня есть псевдонимы для радианов и градусов, которые используют float в качестве типа хранения.

Когда я конвертирую между этими двумя единицами, я вижу, что сборка увеличивает значения до двойных, а затем снова до плавающих при выполнении преобразований.

Вопрос: Как я могу убедиться, что все операции и преобразования остаются в плавающих значениях?

Мой Код:

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

В проводнике компилятора я вижу следующие инструкции по сборке: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Преобразует значение с плавающей запятой одной точности в исходном операнде “преобразовать из” в значение с плавающей запятой двойной точности в целевом операнде.

  • mulsd - Умножает значение с плавающей запятой низкой двойной точности во втором исходном операнде на значение с плавающей запятой низкой двойной точности в первом исходном операнде.

  • cvtsd2ss - Преобразует значение с плавающей запятой двойной точности в исходном операнде “преобразовать из” в значение с плавающей запятой одной точности

PS: Я не удивлюсь, если я неправильно определил свои псевдонимы или/и функции преобразования.

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

Лучший ответ

1

Я нашел хитрый обходной путь (который, я уверен, можно "упростить", заставив единицы наддува вычислять константу 57.x градусов на радиан), чтобы избежать преобразования в и из double, но это действительно подчеркивает тот факт, что блоки повышения вызывают еще один удивительный вид накладных расходов: загрузка и хранение памяти, которые не нужны, если вы используете float напрямую или даже в вашей собственной обертке для float.

Демо: https://godbolt.org/z/afPE7baxT

Таким образом, хотя вышесказанное показывает один (неочищенный) способ заставить вычисления оставаться плавающими, если ваш реальный вопрос "Как мне избежать накладных расходов", вы все еще немного далеки от нирваны.

2021-11-23 10:46:36

к сожалению, использование углов было минимальным воспроизводимым примером в вопросе "Как мне избежать накладных расходов", поскольку проблема применима и ко многим другим устройствам, которые мне также нужны.
CJCombrink

@CJCombrink: Да, я хочу сказать, что, похоже, чтобы избежать (всех) накладных расходов, может потребоваться отказаться от блоков повышения, основываясь на демо, которое я сделал выше.
John Zwinck

Наличие деструктора или конструктора копирования в вашей оболочке может привести к такой неоптимальности.
n. 1.8e9-where's-my-share m.

На других языках

Эта страница на других языках

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