📄 measurement.hpp
字号:
// Boost.Units - A C++ library for zero-overhead dimensional analysis and // unit/quantity manipulation and conversion//// Copyright (C) 2003-2008 Matthias Christian Schabel// Copyright (C) 2008 Steven Watanabe//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_UNITS_MEASUREMENT_HPP#define BOOST_UNITS_MEASUREMENT_HPP#include <cmath>#include <cstdlib>#include <iomanip>#include <iostream>#include <boost/io/ios_state.hpp>#include <boost/units/static_rational.hpp>namespace boost {namespace units {namespace sqr_namespace /**/ {template<class Y>Y sqr(Y val){ return val*val; }} // namespaceusing sqr_namespace::sqr;template<class Y>class measurement{ public: typedef measurement<Y> this_type; typedef Y value_type; measurement(const value_type& val = value_type(), const value_type& err = value_type()) : value_(val), uncertainty_(std::abs(err)) { } measurement(const this_type& source) : value_(source.value_), uncertainty_(source.uncertainty_) { } //~measurement() { } this_type& operator=(const this_type& source) { if (this == &source) return *this; value_ = source.value_; uncertainty_ = source.uncertainty_; return *this; } operator value_type() const { return value_; } value_type value() const { return value_; } value_type uncertainty() const { return uncertainty_; } value_type lower_bound() const { return value_-uncertainty_; } value_type upper_bound() const { return value_+uncertainty_; } this_type& operator+=(const value_type& val) { value_ += val; return *this; } this_type& operator-=(const value_type& val) { value_ -= val; return *this; } this_type& operator*=(const value_type& val) { value_ *= val; uncertainty_ *= val; return *this; } this_type& operator/=(const value_type& val) { value_ /= val; uncertainty_ /= val; return *this; } this_type& operator+=(const this_type& /*source*/); this_type& operator-=(const this_type& /*source*/); this_type& operator*=(const this_type& /*source*/); this_type& operator/=(const this_type& /*source*/); private: value_type value_, uncertainty_;};}}#if BOOST_UNITS_HAS_BOOST_TYPEOFBOOST_TYPEOF_REGISTER_TEMPLATE(boost::units::measurement, 1)#endifnamespace boost {namespace units {template<class Y>inlinemeasurement<Y>&measurement<Y>::operator+=(const this_type& source){ uncertainty_ = std::sqrt(sqr(uncertainty_)+sqr(source.uncertainty_)); value_ += source.value_; return *this;}template<class Y>inlinemeasurement<Y>&measurement<Y>::operator-=(const this_type& source){ uncertainty_ = std::sqrt(sqr(uncertainty_)+sqr(source.uncertainty_)); value_ -= source.value_; return *this;}template<class Y>inlinemeasurement<Y>&measurement<Y>::operator*=(const this_type& source){ uncertainty_ = (value_*source.value_)* std::sqrt(sqr(uncertainty_/value_)+ sqr(source.uncertainty_/source.value_)); value_ *= source.value_; return *this;}template<class Y>inlinemeasurement<Y>&measurement<Y>::operator/=(const this_type& source){ uncertainty_ = (value_/source.value_)* std::sqrt(sqr(uncertainty_/value_)+ sqr(source.uncertainty_/source.value_)); value_ /= source.value_; return *this;}// value_type op measurementtemplate<class Y>inlinemeasurement<Y>operator+(Y lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs,Y(0))+=rhs);}template<class Y>inlinemeasurement<Y>operator-(Y lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs,Y(0))-=rhs);}template<class Y>inlinemeasurement<Y>operator*(Y lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs,Y(0))*=rhs);}template<class Y>inlinemeasurement<Y>operator/(Y lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs,Y(0))/=rhs);}// measurement op value_typetemplate<class Y>inlinemeasurement<Y>operator+(const measurement<Y>& lhs,Y rhs){ return (measurement<Y>(lhs)+=measurement<Y>(rhs,Y(0)));}template<class Y>inlinemeasurement<Y>operator-(const measurement<Y>& lhs,Y rhs){ return (measurement<Y>(lhs)-=measurement<Y>(rhs,Y(0)));}template<class Y>inlinemeasurement<Y>operator*(const measurement<Y>& lhs,Y rhs){ return (measurement<Y>(lhs)*=measurement<Y>(rhs,Y(0)));}template<class Y>inlinemeasurement<Y>operator/(const measurement<Y>& lhs,Y rhs){ return (measurement<Y>(lhs)/=measurement<Y>(rhs,Y(0)));}// measurement op measurementtemplate<class Y>inlinemeasurement<Y>operator+(const measurement<Y>& lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs)+=rhs);}template<class Y>inlinemeasurement<Y>operator-(const measurement<Y>& lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs)-=rhs);}template<class Y>inlinemeasurement<Y>operator*(const measurement<Y>& lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs)*=rhs);}template<class Y>inlinemeasurement<Y>operator/(const measurement<Y>& lhs,const measurement<Y>& rhs){ return (measurement<Y>(lhs)/=rhs);}/// specialize power typeof helpertemplate<class Y,long N,long D> struct power_typeof_helper<measurement<Y>,static_rational<N,D> >{ typedef measurement< typename power_typeof_helper<Y,static_rational<N,D> >::type > type; static type value(const measurement<Y>& x) { const static_rational<N,D> rat; const Y m = Y(rat.numerator())/Y(rat.denominator()), newval = std::pow(x.value(),m), err = newval*std::sqrt(std::pow(m*x.uncertainty()/x.value(),2)); return type(newval,err); }};/// specialize root typeof helpertemplate<class Y,long N,long D> struct root_typeof_helper<measurement<Y>,static_rational<N,D> > { typedef measurement< typename root_typeof_helper<Y,static_rational<N,D> >::type > type; static type value(const measurement<Y>& x) { const static_rational<N,D> rat; const Y m = Y(rat.denominator())/Y(rat.numerator()), newval = std::pow(x.value(),m), err = newval*std::sqrt(std::pow(m*x.uncertainty()/x.value(),2)); return type(newval,err); }};// stream outputtemplate<class Y>inlinestd::ostream& operator<<(std::ostream& os,const measurement<Y>& val){ boost::io::ios_precision_saver precision_saver(os); boost::io::ios_flags_saver flags_saver(os); os << val.value() << "(+/-" << val.uncertainty() << ")"; return os;}} // namespace units} // namespace boost#endif // BOOST_UNITS_MEASUREMENT_HPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -