⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measurement.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 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 + -