Boost Units 使用问题 - hash_value, count 乘法

Posted

技术标签:

【中文标题】Boost Units 使用问题 - hash_value, count 乘法【英文标题】:Boost Units Usage Questions - hash_value, count multiplication 【发布时间】:2012-06-18 17:17:26 【问题描述】:

我正在尝试自学 Boost 单元,但在将单元用作浮点替代品时遇到了一些问题。

    我正在使用自定义的道尔顿/amu 单位进行计算。我的旧代码像

    float baseMass = 14.95;
    float totalMass = baseMass * 12;
    

    但是,对单位做同样的事情(dalton_t 是数量的 typedef)

    dalton_t baseMass = 14.95 * units::dalton_mass;
    dalton_t totalMass = baseMass * 12;
    

    提供错误“二进制表达式的操作数无效”。这是否意味着 12 应该是某种无量纲单位?

    我还使用质量作为无序集中的键。

    typedef boost::unordered_set<types::dalton_t> DaltonSet;
    DaltonSet dSet;
    dalton_t testMass(13384.384 * phobos::units::dalton_mass);
    dSet.insert(testMass);
    

    这提供了一个错误“No matching function for call to hash_value”,即使它是在单元的头文件中定义的。

对其中任何一个有什么想法吗?

单位头文件如下:

#ifndef UNITS_H_
#define UNITS_H_
#include <boost/functional/hash.hpp>
#include <boost/units/conversion.hpp>
#include <boost/units/io.hpp>
#include <boost/units/pow.hpp>
#include <boost/units/systems/si.hpp>
#include <boost/units/systems/si/prefixes.hpp>

namespace phobos 


namespace units 
using boost::units::mass_dimension;
using boost::units::pow;
using boost::units::root;
using boost::units::quantity;
using boost::units::unit;

struct amu_mass_base_unit :
    boost::units::base_unit<amu_mass_base_unit, mass_dimension, 1> 
        static std::string name()  return "atomic mass unit"; 
        static std::string symbol()  return "u"; 
    ;

    typedef boost::units::make_system<amu_mass_base_unit>::type amu_system;
    typedef unit<mass_dimension, amu_system> amu_mass;
    static const amu_mass dalton_mass;
 /* namespace units */

namespace types 
using boost::units::quantity;
typedef quantity<units::amu_mass, float> amu_t;
typedef amu_t dalton_t;
 /* namespace types */
 /* namespace phobos */

BOOST_UNITS_DEFINE_CONVERSION_FACTOR(phobos::units::amu_mass_base_unit,
        boost::units::si::kilogram_base_unit,
        float, 1.66053892173e-27);

std::size_t hash_value(const phobos::types::amu_t &amu) 
    return boost::hash_value(amu.value());


#endif /* UNITS_H_ */

提前谢谢你!

亚当

【问题讨论】:

【参考方案1】:

您的第一个问题解决了 Boost.Units 的一个已知弱点:算术表达式中没有类型提升,因此标量必须与数量的类型匹配。 baseMass * 12.0f 应该可以工作。

【讨论】:

这是有道理的。我可以从 int->float 转换中获得多少计算降级?还是减速?还是在我没有意识到的情况下发生了?我承认我不太了解 x86_64 浮动机制的内部工作原理。 @notwithoutend:对于普通的 C++ 内置类型,这种提升无论如何都会在内部发生。 Boost.Units 不这样做是一个错误。 太棒了。非常感谢你的帮助。我想你对第二个问题没有任何想法?【参考方案2】:

至于 boost 单元不可散列,我也想通了:

namespace std 
template <> struct hash<phobos::types::amu_t> 
    inline std::size_t operator()(const phobos::types::amu_t &amu) const 
        return std::hash<phobos::types::mass_store_t>()(amu.value());
    
;

【讨论】:

以上是关于Boost Units 使用问题 - hash_value, count 乘法的主要内容,如果未能解决你的问题,请参考以下文章

Astropy Units equivalencies - 使用类和 SI 前缀的干涉测量基线

参数化查询.....需要未提供的参数“@units”

iOS5 Effect Units应该使用啥流格式

使用 Audio Units 播放多个重叠的短音频文件

Audio Units是不是支持airplay?

张量流 BasicLSTMCell 中的 num_units 是啥?