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

gmp_float

Boost , Chapter 1. Boost.Multiprecision , floating-point Numbers

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

<#include<boost/multiprecision/gmp.hpp>>

namespace boost{ namespace multiprecision{
template <unsigned Digits10>
class gmp_float;
typedef number<gmp_float<50> >    mpf_float_50;
typedef number<gmp_float<100> >   mpf_float_100;
typedef number<gmp_float<500> >   mpf_float_500;
typedef number<gmp_float<1000> >  mpf_float_1000;
typedef number<gmp_float<0> >     mpf_float;
}} // namespaces

<gmp_float>используется совместно с<number>: Он действует как тонкая обертка вокругGMP.<mpf_t>, чтобы обеспечить тип реального числа, который является заменой для родных типов C++ с плавающей запятой, но с гораздо большей точностью.

Тип<gmp_float>можно использовать с фиксированной точностью, указав ненулевой<Digits10>параметр шаблона, или с переменной точностью, установив аргумент шаблона до нуля. Типдефы mpf_float_50, mpf_float_100, mpf_float_500, mpf_float_1000 обеспечивают арифметические типы с точностью 50, 100, 500 и 1000 десятичных знаков соответственно. Typedef mpf_float обеспечивает переменный тип точности, точность которого может управляться через функции<number>.

[Note] Note

Этот тип обеспечивает только стандартную библиотеку и поддержку<numeric_limits>, когда точность фиксируется во время компиляции.

Как и обычные преобразования из арифметических и струнных типов, экземпляры<number<mpf_float<N>>>являются копируемыми и присваиваемыми из:

  • GMPродные типы<mpf_t>,<mpz_t>,<mpq_t>.
  • <number>Обертки вокруг этих типов:<number<mpf_float<M>>>,<number<gmp_int>>,<number<gmp_rational>>.

Также можно получить доступ к базовой<mpf_t>функции<data()>члена<gmp_float>.

Что вы должны знать при использовании этого типа:

  • По умолчанию построенные<gmp_float>s имеют нулевое значение (это поведение библиотекиGMPпо умолчанию).
  • В глобальные настройки библиотекиGMPизменений не вносятся, поэтому этот тип можно безопасно смешать с существующим кодомGMP.
  • Этот бэкэнд поддерживает rvalue-ссылки и является Move-Aware, делая выводы<number>об этом бэкэнд-движении осведомленными.
  • Невозможно обогнуть объекты этого типа в струну и обратно и получить точно такое же значение. Это, по-видимому, является ограничениемGMP.
  • Поскольку основные типыGMPне имеют понятия о бесконечностях или NaN, следует соблюдать осторожность, чтобы избежать численного переполнения или деления на ноль. Последнее приведет к выпадению std::overflow_error, в то время как генерация чрезмерно больших экспонентов может привести к нестабильности базовой библиотекиGMP(при тестировании преобразование числа с чрезмерно большим или малым экспонентом в строку вызвалоGMPсегфолт).
  • Этот тип может в равной степени использоваться сMPIRв качестве базовой реализации - действительно, это рекомендуемый вариант на Win32.
  • Преобразование из строки приводит к тому, что<std::runtime_error>бросается, если строка не может быть интерпретирована как действительное число с плавающей точкой.
  • В результате деление на ноль приводит к выпадению<std::overflow_error>.
GMP example:
#include <boost/multiprecision/gmp.hpp>
#include <boost/math/special_functions/gamma.hpp>
#include <iostream>
int main()
{
   using namespace boost::multiprecision;
   // Operations at variable precision and limited standard library support:
   mpf_float a = 2;
   mpf_float::default_precision(1000);
   std::cout << mpf_float::default_precision() << std::endl;
   std::cout << sqrt(a) << std::endl; // print root-2
   // Operations at fixed precision and full standard library support:
   mpf_float_100 b = 2;
   std::cout << std::numeric_limits<mpf_float_100>::digits << std::endl;
   // We can use any C++ std lib function:
   std::cout << log(b) << std::endl; // print log(2)
   // We can also use any function from Boost.Math:
   std::cout << boost::math::tgamma(b) << std::endl;
   // These even work when the argument is an expression template:
   std::cout << boost::math::tgamma(b * b) << std::endl;
   // Access the underlying representation:
   mpf_t f;
   mpf_init(f);
   mpf_set(f, a.backend().data());
   mpf_clear(f);
   return 0;
}

PrevUpHomeNext

Статья gmp_float раздела Chapter 1. Boost.Multiprecision floating-point Numbers может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: floating-point Numbers ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:25:10/0.0091679096221924/1