【问题标题】:how to keep unit conversions in boost::units in single-precision floats?如何将 boost::units 中的单位转换保持在单精度浮点数中?
【发布时间】:2022-01-01 19:49:13
【问题描述】:

我有使用 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 - 将“convert-from”源操作数中的单精度浮点值转换为目标操作数中的双精度浮点值。

  • mulsd - 将第二个源操作数中的低位双精度浮点值乘以第一个源操作数中的低位双精度浮点值。

  • cvtsd2ss - 将“convert-from”源操作数中的双精度浮点值转换为单精度浮点值

PS:如果我错误地定义了我的别名或/和我的转换函数,我不会感到惊讶。

【问题讨论】:

    标签: c++ boost c++14 boost-units


    【解决方案1】:

    我找到了一个 hacky 解决方法(我确信可以通过让 Boost Units 计算每弧度常数 57.x 度来“生产化”)以避免与double 之间的转换,但它确实突出了一个事实Boost Units 会导致另一种令人惊讶的开销:如果您直接使用 float,甚至是您自己的 float 包装器,则不需要内存加载和存储。

    演示:https://godbolt.org/z/afPE7baxT

    因此,尽管上面显示了一种(未完善的)强制计算保持为浮点数的方法,但如果您真正的问题是“我如何避免开销”,那么您离必杀技还有点距离。

    【讨论】:

    • 不幸的是,使用角度是“如何避免开销”问题中最小的可重现示例,因为该问题也适用于我需要的许多其他单位。
    • @CJCombrink:是的,我的意思是,根据我上面制作的演示,看起来避免(所有)开销可能需要放弃 Boost Units。
    • 在包装器中包含析构函数或复制构造函数可能会导致这种次优性。
    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2013-04-16
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2011-02-27
    相关资源
    最近更新 更多