问题标签 [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 投票
1 回答
508 浏览

c++ - Boost.Units 频率到周期

我正在尝试使用 Boost.Units 库将频率(例如,20kHz)转换为其周期的持续时间(50000 纳秒)。我不想使用浮点数。

我遇到的麻烦是,简单地取倒数 1/f 会导致零截断,所以即使转换为纳秒后,结果也是 0ns。如果我先转换为兆赫然后取倒数,那么第一步再次导致零截断。

我发现的一种解决方法是使用 boost::rational 作为数量的 value_type。这行得通,但它让我觉得丑陋。有没有更好的解决方案?我对 Units 库还很陌生,到目前为止有点不知所措。

我现在的解决方案:

0 投票
1 回答
587 浏览

c++ - Boost::units::quantity“不完整类型”错误

我正在尝试在项目中使用 boost::units 但遇到了麻烦。

我有一个模板类,其中有一些quantity对象作为成员。在一个中,我希望存储一个具有压力维度的值,因此我已将其quantity<pressure> press;声明为成员变量。

然而,这给出了一个错误,说quantity需要两个模板参数(源代码显示第二个模板参数应该默认为double)。如果我然后指定quantity<pressure,double> press;我会得到一个错误,上面写着

  • 错误:字段“press”的类型不完整。

我做错了什么还是以某种方式实施压力有问题?

最小的例子:

细节:

  • 提升 1.54.0
  • g++ 4.7.3
0 投票
2 回答
3087 浏览

c++ - 使用 Boost::units 在两个数量之间进行转换的最简单方法?

如果我只想将一个值从一个单位转换为另一个单位,那么最简单(理想情况下是单行)的方法是什么?

例如,我想以米为单位存储一个值,但以英里为单位指定它。

执行此操作的大多数示例似乎很长,涉及 typedef 和单元定义,并且没有给出简单的无单元输出。

0 投票
2 回答
863 浏览

c++ - 如何使用可能不同的 boost::dimension 存储 boost::quantity

我正在使用boost::units库来强制科学项目中的物理一致性。我已经阅读并尝试了 boost 文档中的几个示例。我能够创建我的尺寸、单位和数量。我做了一些微积分,效果很好。这正是我所期望的,除了...

在我的项目中,我处理基于六个维度的具有多个不同单位(温度、浓度、密度等)的时间序列。为了允许安全和简单的单位转换,我想为每个通道类添加一个成员,表示时间序列的维度和单位。而且,数据处理(导入、转换等)是用户驱动的,因此是动态的。

我的问题如下,由于boost::units结构的原因,同质系统中的数量但具有不同的维度有不同的类型。因此,您不能直接声明成员,例如:

编译器将声称您必须使用模板 V 形指定尺寸。但如果这样做,您将无法存储不同类型的数量(例如具有不同维度的数量)。

然后,我查找boost::units::quantity声明以了解是否有可以以多态方式使用的基类。但是我没有找到它,相反我发现它boost::units大量使用了模板元编程,这不是问题,但并不完全符合我的动态需求,因为一切都是在编译时而不是在运行时解决的。

经过更多阅读,我尝试将不同的数量包装在一个boost::variant对象中(很高兴第一次见到它)。

我进行了一些测试,它似乎工作。但我对boost::variantvisitor-pattern没有信心。

我的问题如下:

  • 是否有另一种 - 也许是最好的 - 方法来进行运行时类型解析?
  • dynamic_cast其中之一吗?单位转换不会经常发生,只有很少的数据需要关注。
  • 如果boost::variant是一个合适的解决方案,它的缺点是什么?
0 投票
0 回答
670 浏览

c++ - 混合缩放和派生单位 un boost::units

我想boost::units在项目中使用a来使用尺寸分析和单位系统之间的自动转换。我想用标准工程单位表示代码中的数量,这些单位通常是其他单位的缩放版本。让我用一个例子来解释这一点。假设我定义了以下系统

然后长度单位将定义为英尺,力 inlb*ft*s^-2和压力 in lb*ft^-1*s^-2。但是,我想使用磅力单位的力和 PSI 中的压力,即每平方英寸的磅力。我以为我可以使用缩放单位来表达这些并可以互换使用它们,但事实似乎并非如此。

我试过这个:

哪个编译没有问题。但是当我尝试像这样使用缩放单位时:

编译失败,出现“没有可行的转换错误”。我认为缩放单位的目的是自动进行这些转换。而且文档也让我认为我只需要定义 name_string 和 symbol_string 就可以打印磅力数量,但是这个

导致“boost::units::scale_list_dim 中没有名为符号的成员”错误。显然重载这些函数不适用于缩放单位。

也许我应该定义另一个这样的系统

但是,如果我想用 ft 表示长度和用 psi 表示压力,我无论如何都需要转换。

如果有人有更好的解决方案,我会很高兴。

0 投票
1 回答
968 浏览

c++ - 如何将 boost::units::metric::hour_base_unit 转换为 boost::units::si::time?

我想让以下代码正确编译:

使用 gcc,我收到以下错误:

我错过了什么?

0 投票
0 回答
103 浏览

floating-point - 在 Boost.Units 中基于自定义单位的数量之间强制执行基于理性的转换

我定义了一个自定义单位系统,它源自 boost::units::si::time。子单位使用 boost::units::make_scaled_unit 定义,因此转换因子使用 boost::units::scale 和 boost::units::static_rational 指定,例如 boost::units::scale<1020, boost::单位::static_rational<1> >。

一般来说,如果不是因为 boost::units::scale::value_type 是“double”,我不会抱怨。因此,数量之间的所有运行时转换都涉及浮点运算,而我的自定义单位之间的比率都是整数,例如 1 个苹果等于 18 个橙子,使用基于有理的因子进行转换就足够了。

有没有办法用其他东西覆盖用于单位转换的浮点算术?谢谢。

编辑:1.我的数量是使用整数类型定义的。

0 投票
1 回答
214 浏览

c++ - 提升异构单位 - 每分钟酒吧

我需要创建一个代表每次压力的单位,特别是每分钟的 Bar。我尝试以与之前创建类似单位相同的方式创建它:

然后我尝试使用它:

但是这条线并没有编译很长的错误线索,我在完全理解时遇到了一些麻烦。

根据 Boost 文档,同质系统只能由线性独立的基本单元组成。就我而言,我试图将条形图(它反过来“包含”秒作为时间元素)与分钟混合。这对我来说听起来有问题。但另一方面,由于我的系统中没有包含质量和长度基本单位,在我看来,基本单位毕竟是独立的。

无论如何,我在网上搜索了创建这种异构单元的示例,但没有找到任何可以理解的内容。此外,我在 Boost 文档中读到,异构单元不会保留有关其创建方式的信息。这是否意味着我无法将 BarPerMinuteRoC 乘以 Minute 并返回 Bar?

0 投票
1 回答
503 浏览

c++ - Why would a template class have an unused type?

I'm reviewing the boost units library and I am puzzled why the boost::units::unit class has an extra template parameter. Here is the example:

http://www.boost.org/doc/libs/1_57_0/boost/units/unit.hpp

The class is used to add dimensions to dimension system.

What purpose would "Enable" serve in this case?

0 投票
1 回答
244 浏览

c++ - 如何将 Boost 单元作为方法参数传递

我正在尝试在我的项目中使用 Boost.Units。我主要让它工作,但我想要一个访问器方法,它允许我使用不同的缩放值来获取原始值。例如,我想一次获得以伏特为单位的值,但在另一点我需要以毫伏为单位的值。我可以使用 conversion_factor 方法转换数字。但是,我想让使用传入默认比例的访问器更方便。这是我尝试使用的类的访问器方法:

我正在尝试像这样使用它:

但是,这不会编译。我收到以下错误:

我显然做错了什么,但是报告的错误很难用其中的所有模板代码解析,我不确定我做错了什么。我希望有人可能做过类似的事情并且能够告诉我我在哪里误入歧途?