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

Mixed Precision Arithmetic

Boost , Chapter 1. Boost.Multiprecision , Tutorial

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

Смешанная точная арифметика полностью поддерживается библиотекой.

Существуют две различные формы:

  • Где операнды отличаются точностью.
  • где операнды имеют одинаковую точность, но дают более высокий результат точности.
Mixing Operands of Differing Precision

Если аргументы двоичного оператора имеют разную точность, то операция допускается до тех пор, пока существует однозначное неявное преобразование из одного типа аргументов в другой. Во всех случаях арифметика выполняется «как если бы» перед применением оператора низкоточный тип был повышен до более высокоточного типа. Тем не менее, определенные бэкэнды могут оптимизировать это и избежать создания временного, если они могут это сделать.

Например:

mpfr_float_50         a(2), b;
mpfr_float_100        c(3), d;
static_mpfr_float_50  e(5), f;
mpz_int               i(20);
d = a * c;  // OK, result of operand is an mpfr_float_100.
b = a * c;  // Error, can't convert the result to an mpfr_float_50 as it will lose digits.
f = a * e;  // Error, operator is ambiguous, result could be of either type.
f = e * i;  // OK, unambiguous conversion from mpz_int to static_mpfr_float_50
Operands of the Same Precision

Иногда требуется применить оператора к двум аргументам одинаковой точности таким образом, чтобы получить результат более высокой точности. Наиболее распространенная ситуация происходит с фиксированными целыми числами, где вы хотите умножить два N-битных числа, чтобы получить 2N-битный результат. Это поддерживается в этой библиотеке следующими бесплатными функциями:

template <class ResultType, class Source1 class Source2>
ResultType& add(ResultType& result, const Source1& a, const Source2& b);
template <class ResultType, class Source1 class Source2>
ResultType& subtract(ResultType& result, const Source1& a, const Source2& b);
template <class ResultType, class Source1 class Source2>
ResultType& multiply(ResultType& result, const Source1& a, const Source2& b);

Эти функции применяют названного оператора к аргументам.aиbи сохранить результат вРезультатВозвращениерезультат. Во всех случаях они ведут себя «как будто» аргументами.aиbбыли сначала продвинуты на тип<ResultType>перед применением оператора, хотя отдельные бэкэнды вполне могут избежать этого шага посредством оптимизации.

Тип<ResultType>должен быть экземпляром класса<number>, а типы<Source1>и<Source2>могут быть либо экземплярами класса<number>, либо нативными целыми типами. Последнее представляет собой оптимизацию, которая позволяет выполнять арифметику на нативных целых типах, производя расширенный результат точности.

Например:

#include <boost/multiprecision/cpp_int.hpp>
int main()
{
   using namespace boost::multiprecision;
   boost::uint64_t i = (std::numeric_limits<boost::uint64_t>::max)();
   boost::uint64_t j = 1;
   uint128_t ui128;
   uint256_t ui256;
   //
   // Start by performing arithmetic on 64-bit integers to yield 128-bit results:
   //
   std::cout << std::hex << std::showbase << i << std::endl;
   std::cout << std::hex << std::showbase << add(ui128, i, j) << std::endl;
   std::cout << std::hex << std::showbase << multiply(ui128, i, i) << std::endl;
   //
   // The try squaring a 128-bit integer to yield a 256-bit result:
   //
   ui128 = (std::numeric_limits<uint128_t>::max)();
   std::cout << std::hex << std::showbase << multiply(ui256, ui128, ui128) << std::endl;
   return 0;
}

Производит продукцию:

0xffffffffffffffff
0x10000000000000000
0xFFFFFFFFFFFFFFFE0000000000000001
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000001
Backends With Optimized Mixed Precision Arithmetic

Следующие бэкэнды имеют, по крайней мере, некоторую прямую поддержку смешанной точной арифметики, и поэтому избегают создания ненужных временных интервалов при использовании интерфейсов выше. Поэтому при использовании этих типов более эффективно использовать смешанную точную арифметику, чем явно отбрасывать операнды к типу результата:

mpfr_float,gmp_float,cpp_int.


PrevUpHomeNext

Статья Mixed Precision Arithmetic раздела Chapter 1. Boost.Multiprecision Tutorial может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Tutorial ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:23:08/0.0088541507720947/1