Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Quick Start

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 40. Boost.Units 1.1.0

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Прежде чем обсуждать основы библиотеки, мы сначала определим несколько терминов, которые будут часто использоваться в следующем:

  • Базовое измерение: Базовое измерение свободно определяется как измеримая единица интереса; в обычном размерном анализе базовые измерения включают длину ([L]), массу ([M]), время ([T]) и т. Д., Но нет никаких конкретных ограничений на то, какие базовые измерения могут быть использованы. Базовые измерения по существу являются типом тега и сами по себе не обеспечивают функциональности анализа размерности.
  • Измерение: Коллекция нулевых или более базовых измерений, каждое из которых потенциально может быть поднято до другой рациональной силы. Например, длина = [L]^1, площадь = [L]^2, скорость = [L]^1/[T]^1 и энергия = [M]^1 [L]^2/[T]^2 — все измерения.
  • Базовый блок: Базовая единица представляет собой определенную меру измерения. Например, в то время как длина является абстрактной мерой расстояния, измеритель является конкретной базовой единицей расстояния. Конверсии определяются с использованием базовых единиц. Как и базовые измерения, базовые единицы являются типом тега, используемым исключительно для определения единиц и не поддерживающим алгебру анализа измерений.
  • Единица: Набор базовых единиц, поднятых до рациональных показателей, например m^1, кг^1, m^1/s^2.
  • Система: Единичная система представляет собой совокупность базовых единиц, представляющих все измеримые объекты, представляющие интерес для конкретной проблемы. Например, система единиц СИ определяет семь базовых единиц: длина (L) в метрах, масса (M) в килограммах, время (T) в секундах, ток (I) в амперах, температура (theta) в кельвине, количество (N) в родинках и интенсивность света (J) в канделябрах. Все измеримые сущности в системе СИ могут быть представлены как продукты различных целых или рациональных сил этих семи базовых единиц.
  • Количество: Количество представляет собой конкретное количество единицы. Таким образом, в то время как измеритель является базовой единицей длины в системе СИ, 5,5 метра является величиной длины в этой системе.

Для начала представим два коротких учебника.Учебник1демонстрирует использованиеединиц СИ. После включения соответствующих системных заголовков и заголовков для различных единиц СИ, которые нам понадобятся (все единицы СИ могут быть включены в<boost/units/systems/si.hpp>) и для количества I/O (<boost/units/io.hpp>), мы определяем функцию, которая вычисляет работу в джоулях, выполняемую с помощью силы в ньютонах на заданном расстоянии в метрах и выводит результат в<std::cout>. Класс<quantity>принимает второй параметр шаблона в качестве своего типа значения; этот параметр по умолчанию<double>, если не указано иное. Чтобы продемонстрировать простоту использования определяемых пользователем типов в размерных вычислениях, мы также представляем код для вычисления сложного импеданса с использованием<std::complex<double>>в качестве типа значения:

#include <complex>
#include <iostream>
#include <boost/typeof/std/complex.hpp>
#include <boost/units/systems/si/energy.hpp>
#include <boost/units/systems/si/force.hpp>
#include <boost/units/systems/si/length.hpp>
#include <boost/units/systems/si/electric_potential.hpp>
#include <boost/units/systems/si/current.hpp>
#include <boost/units/systems/si/resistance.hpp>
#include <boost/units/systems/si/io.hpp>
using namespace boost::units;
using namespace boost::units::si;
quantity<energy>
work(const quantity<force>& F, const quantity<length>& dx)
{
    return F * dx; // Defines the relation: work = force * distance.
}
int main()
{
    /// Test calculation of work.
    quantity<force>     F(2.0 * newton); // Define a quantity of force.
    quantity<length>    dx(2.0 * meter); // and a distance,
    quantity<energy>    E(work(F,dx));  // and calculate the work done.
    std::cout << "F  = " << F << std::endl
              << "dx = " << dx << std::endl
              << "E  = " << E << std::endl
              << std::endl;
    /// Test and check complex quantities.
    typedef std::complex<double> complex_type; // double real and imaginary parts.
    // Define some complex electrical quantities.
    quantity<electric_potential, complex_type> v = complex_type(12.5, 0.0) * volts;
    quantity<current, complex_type>            i = complex_type(3.0, 4.0) * amperes;
    quantity<resistance, complex_type>         z = complex_type(1.5, -2.0) * ohms;
    std::cout << "V   = " << v << std::endl
              << "I   = " << i << std::endl
              << "Z   = " << z << std::endl
              // Calculate from Ohm's law voltage = current * resistance.
              << "I * Z = " << i * z << std::endl
              // Check defined V is equal to calculated.
              << "I * Z == V? " << std::boolalpha << (i * z == v) << std::endl
              << std::endl;
    return 0;
}

Намерение и функция вышеупомянутого кода должны быть очевидными; полученный результат:

F  = 2 N
dx = 2 m
E  = 4 J
V   = (12.5,0) V
I   = (3,4) A
Z   = (1.5,-2) Ohm
I*Z = (12.5,0) V
I*Z == V? true

Хотя эта библиотека пытается упростить кодирование простых размерных вычислений, она никоим образом не привязана к какой-либо конкретной системе единиц (SI или иным образом). Вместо этого он обеспечивает очень гибкую систему компиляции-времени для анализа размеров, поддерживая произвольные коллекции базовых измерений, рациональные силы единиц и явные преобразования количества. Все это достигается с помощью методов метапрограммирования шаблонов. С современными оптимизирующими компиляторами это приводит к нулевым накладным расходам времени выполнения для количественных вычислений относительно того же кода без проверки блока.


PrevUpHomeNext

Статья Quick Start раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 40. Boost.Units 1.1.0 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 40. Boost.Units 1.1.0 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:39:42/0.0098340511322021/1