我想在 C++ 中进行数值微分。为了类型安全,我想使用boost::units
避免混合单位,但也boost::units::absolute
避免混合相对单位和绝对单位。
一个最小的例子是将速度计算为位置变化除以时间变化的函数:v = dx/dt
,可以近似为(x1 - x0)/(t1 - t0)
。
在这个例子v
中,有一个绝对单位(速度)dx
和dt
一个相对单位(距离/持续时间)。
如果boost::units
我们简单地在任何地方取相对单位,就会得出正确的单位,
static_assert(std::is_same<boost::units::divide_typeof_helper<
boost::units::si::length,
boost::units::si::time>::type,
boost::units::si::velocity>::value);
static_assert
如果我们希望除法的结果是绝对速度,则失败:
static_assert(std::is_same<boost::units::divide_typeof_helper<
boost::units::si::length,
boost::units::si::time>::type,
boost::units::absolute<boost::units::si::velocity>>::value);
我是否做了错误的假设,即除以两个相对单位的结果应该总是产生一个绝对单位?或者这是执行过程中的错误boost::units
?