使用Boost.Units和Boost.Multiprecision

时间:2013-05-10 21:16:12

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

我正在尝试编写分子动力学程序,我认为Boost.Units是变量的逻辑选择,我还认为Boost.Multiprecision提供了比double或{{1更好的选项关于舍入错误。在我尝试使用常量之前,两者的组合似乎相当直接,然后它就会崩溃。

long double

输出为#include <boost/multiprecision/gmp.hpp> #include <boost/units/io.hpp> #include <boost/units/pow.hpp> #include <boost/units/quantity.hpp> #include <boost/units/systems/si.hpp> #include <boost/units/systems/si/codata/physico-chemical_constants.hpp> namespace units = boost::units; namespace si = boost::si; namespace mp = boost::multiprecision; units::quantity<si::mass, mp::mpf_float_50> mass = 1.0 * si::kilogram; units::quantity<si::temperature, mp::mpf_float_50> temperature = 300. * si::kelvin; auto k_B = si::constants::codata::k_B; // Boltzmann constant units::quantity<si::velocity, mp::mpf_float_50> velocity = units::root<2>(temperature * k_B / mass); std::cout << velocity << std::endl; 。如果我使用1 M S^-1代替long double,则结果为mp::mpf_float_50。我知道问题在常量和其他数据之间的转换中是喜欢的,因为常量默认为2.87818e-11 m s^-1。我考虑过创建自己的Boltzmann常数,但如果可能的话,我更喜欢使用预定义的值。

因此,我的问题是,当我从Boost.Units预定义常量时,如何使用Boost.Multiprecision?如果我必须承认使用doubledouble,那么我会,但我怀疑有一种方法可以转换或利用另一个常量。

我正在使用Mac OS X 10.7,Xcode 4.6.2,Clang 3.2,Boost 1.53.0和C ++ 11扩展。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

我建议你不要使用多个精确算法进行分子动力学模拟,因为时间步长积分会非常缓慢。如果目标是尽可能地保留总能量,那么只需使用Verlet或任何其他辛积分器。但是,多精度算术(或long double或带有普通double的补偿求和)可用于聚合整体平均值。

此外,如果你使用无量纲(简化)单位编写模拟代码,你也将摆脱对Boost.Units的依赖。