问题标签 [boost-units]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
34 浏览

c++ - 无缝混搭 boost::units::quantity

两者都std::chrono::duration代表boost::units::quantity<time>相同的物理维度。我正在寻找的是一种使用这些类型的值可互换的方法,例如在需要 a 的quantity<time>地方使用 a ,std::clock::duration反之亦然。

请注意,我已经有了转换功能,但是手动进行转换感觉很笨拙。编译器应该能够自动进行转换。

一个例子是将 chrono_literals 分配给一个数量:

我当前的转换功能:

0 投票
1 回答
56 浏览

c++ - 如何使用 Boost Units 进行数值微分?

我想在 C++ 中进行数值微分。为了类型安全,我想使用boost::units避免混合单位,但也boost::units::absolute避免混合相对单位和绝对单位。

一个最小的例子是将速度计算为位置变化除以时间变化的函数:v = dx/dt,可以近似为(x1 - x0)/(t1 - t0)

在这个例子v中,有一个绝对单位(速度)dxdt一个相对单位(距离/持续时间)。

如果boost::units我们简单地在任何地方取相对单位,就会得出正确的单位,

static_assert如果我们希望除法的结果是绝对速度,则失败:

我是否做了错误的假设,即除以两个相对单位的结果应该总是产生一个绝对单位?或者这是执行过程中的错误boost::units

0 投票
1 回答
103 浏览

c++ - 以度为单位定义一个 boost::units 角度

如何以度为单位定义增强单位角度?下面显示了有效的弧度和无效的度数。

0 投票
0 回答
36 浏览

c++ - 应该在尺寸分析之外使用升压单位吗?

我正在寻找一种方法来对不同的测量单位进行更好的类型检查。boost::units 文档以“Boost.Units 库是以通用且可扩展的方式进行维度分析的 C++ 实现......”开头。文档继续说,“......没有引入运行时执行成本......”。

我对在维度分析之外使用升压单元很感兴趣。例如,一个函数参数需要boost::units::degrees而不是简单的double.

我不应该这样做有什么根本原因吗?我在文档中没有找到任何说明我应该或不应该以这种方式使用 boost::units 的内容。

0 投票
0 回答
47 浏览

c++ - 使用 Boost::Units 递归模板的前向声明

由于我正在寻求减少代码的编译时间,因此我目前正在尝试减少头文件中的大量包含。为此,我向前声明函数参数,如下例所示:

但是,我没有找到一种方法来转发声明我们的类型定义,它依赖于提升单位,例如文件 Object.h 中作为函数参数所需的长度单位 (Length.h) 的定义:

关于我如何实现这一目标有什么建议吗?

我试过的:

第一种方法:我尝试向前声明模板 boost::units::quantity<meter_unit, double>; 但是我努力在meter_unit的命名空间内定义包含模板类meter_base_unitunit_typemeter_unit

Meter_base_unit在 boost 单元定义如下(简化),我猜unit_type是在宏BOOST_TYPEOF_REGISTER_TYPE内定义的。

这样的星座甚至可以提前申报吗?如果没有,是否存在可能具有相同好处的替代方案(在仍然使用 Boost Units Library 时避免包含)。

第二种方法:定义从各个单元继承的类,例如:

但问题是,然后我必须为我尝试使用(英尺、米、公里等)初始化长度单位的每个可能单位创建 CTR,这基本上是在重新实现库。

第三种方法:创建一个仅包含长度单位作为变量的类,然后导致该类的所有可能的运算符重载。

我很高兴为我的具体问题所做的每一项贡献以及导致对模板前向声明的更深入理解的每一项贡献。

提前致谢

段错误创建者

0 投票
1 回答
41 浏览

c++ - how to keep unit conversions in boost::units in single-precision floats?

I have aliases for radians and degrees that use float as the storage type.

When I convert between these two units I see the assembly promote the values to doubles and then back to floats when doing conversions.

Q: How can I make sure that all operations and conversions stay in floats?

My Code:

From compiler explorer I see the following assembly instructions: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd - Converts a single-precision floating-point value in the “convert-from” source operand to a double-precision floating-point value in the destination operand.

  • mulsd - Multiplies the low double-precision floating-point value in the second source operand by the low double-precision floating-point value in the first source operand.

  • cvtsd2ss - Converts a double-precision floating-point value in the “convert-from” source operand to a single-precision floating-point value

PS: I would not be surprised if I have defined my aliases or/and my conversion functions incorrectly.