首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Boost.Units和Boost.Multiprecision

使用Boost.Units和Boost.Multiprecision
EN

Stack Overflow用户
提问于 2013-05-11 05:16:12
回答 1查看 660关注 0票数 2

我正在尝试写一个分子动力学程序,我认为Boost.Units是变量的合理选择,我也认为Boost.Multiprecision在舍入误差方面提供了比doublelong double更好的选择。这两者的组合看起来相当简单,直到我尝试使用一个常量,然后它就崩溃了。

代码语言:javascript
复制
#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。我知道问题类似于常量和其他数据之间的转换,因为常量缺省为double。我考虑过创建自己的玻尔兹曼常数,但如果可能的话,我更喜欢使用预定义的值。

因此,我的问题是,当我有来自Boost.Units的预定义常量时,我如何开始使用Boost.Multiprecision?如果我必须承认使用doublelong double,那么我会这样做,但我怀疑有一种方法可以在常量上转换或利用另一个常量。

我正在使用MacOSX10.7,Xcode4.6.2,Clang3.2,Boost 1.53.0和C++11扩展。

我很感谢任何可以提供的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-11 08:03:03

我建议你不要在分子动力学模拟中使用多精度算法,因为时间步长积分将非常缓慢。如果目标是尽可能地保存总能量,那么只需使用Verlet或任何其他辛积分器。不过,多精度算术(或long double,或使用普通double的补偿求和)对于集合平均可能很有用。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16490939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档