簡體   English   中英

使用Boost.Units和Boost.Multiprecision

[英]Using Boost.Units and Boost.Multiprecision

我正在嘗試編寫分子動力學程序,我認為Boost.Units是變量的邏輯選擇,並且我還認為,就舍入誤差而言,Boost.Multiprecision提供了比doublelong 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 MS^-1 如果我使用long double代替mp::mpf_float_50 ,則結果為2.87818e-11 ms^-1 我知道問題在於常量與其他數據之間的轉換,因為常量默認為double 我曾考慮過要創建自己的Boltzmann常數,但是如果可能的話,我更喜歡使用預定義的值。

因此,我的問題是,當我從Boost.Units獲得預定義常量時,如何使用Boost.Multiprecision? 如果必須讓我使用doublelong double ,那么我會這樣做,但是我懷疑存在一種在常量上轉換或利用其他方法的方式。

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

感謝提供的任何幫助。

我建議您不要在分子動力學模擬中使用多精度算法,因為時間步長積分會非常緩慢。 如果目標是盡可能節省總能量,則只需使用Verlet或任何其他辛積分器即可。 但是,多精度算術(或long double或帶純double補償求和)對於匯總總體平均值可能很有用。

此外,如果您使用無量綱(精簡)單元編寫仿真代碼,您還將擺脫對Boost.Units的依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM