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

cpp_bin_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

Включить<Усиление/Многоточность/cpp_bin_float.hpp>

namespace boost{ namespace multiprecision{
enum digit_base_type
{
   digit_base_2 = 2,
   digit_base_10 = 10
};
template <unsigned Digits, digit_base_type base = digit_base_10, class Allocator = void, class Exponent = int, ExponentMin = 0, ExponentMax = 0>
class cpp_bin_float;
typedef number<cpp_bin_float<50> > cpp_bin_float_50;
typedef number<cpp_bin_float<100> > cpp_bin_float_100;
typedef number<backends::cpp_bin_float<24, backends::digit_base_2, void, boost::int16_t, -126, 127>, et_off>       cpp_bin_float_single;
typedef number<backends::cpp_bin_float<53, backends::digit_base_2, void, boost::int16_t, -1022, 1023>, et_off>     cpp_bin_float_double;
typedef number<backends::cpp_bin_float<64, backends::digit_base_2, void, boost::int16_t, -16382, 16383>, et_off>   cpp_bin_float_double_extended;
typedef number<backends::cpp_bin_float<113, backends::digit_base_2, void, boost::int16_t, -16382, 16383>, et_off>  cpp_bin_float_quad;
}} // namespaces

cpp_bin_floatback-end используется в сочетании сномером: Он действует как полностью C++ (только заголовк и без зависимостей) тип числа с плавающей запятой, который является заменой для родных типов с плавающей запятой C++, но с гораздо большей точностью.

Типcpp_bin_floatможно использовать с фиксированной точностью, указав ненулевойDigitsшаблонный параметр. Типдефыcpp_bin_float_50иcpp_bin_float_100обеспечивают арифметические типы с точностью 50 и 100 десятичных знаков соответственно.

Опционально можно указать, указана ли точность в десятичных цифрах или двоичных битах — например, объявитьcpp_bin_floatс точно такой же точностью, как.двойнойможно использоватьномер<cpp_bin_float<53,digit_base_2>>. Типдефыcpp_bin_float_single,cpp_bin_float_double,cpp_bin_float_quadиcpp_bin_float_double_extendedобеспечивают программные аналоги IEEE одинарного, двойного и четырехпоплавкового типов данных плюс Intel-расширенный-двойной тип соответственно. Обратите внимание, что хотя эти типы функционально эквивалентны родным типам IEEE, они не имеют такого же размера или раскладки битов, как истинные совместимые типы IEEE.

Обычноcpp_bin_floatне выделяет памяти: все пространство, необходимое для его цифр, выделяется непосредственно внутри класса. В результате следует позаботиться о том, чтобы не использовать класс со слишком высоким количеством цифр, поскольку требования к пространству стека могут выйти из-под контроля. Если это представляет проблему, то предоставление распределителя в качестве параметра шаблона заставляетcpp_bin_floatдинамически распределять необходимую ему память: это значительно уменьшает размерcpp_bin_floatи увеличивает жизнеспособный верхний предел на количество цифр за счет производительности. Однако имейте в виду, что арифметические операции быстро становятсяочень дорогимипо мере роста числа цифр: текущая реализация действительно не оптимизирована или не предназначена для больших чисел. Обратите внимание, что поскольку фактический тип выделенных объектов является полностью непрозрачным, было бы предложено использовать распределитель сvoidvalue_type, например:номер<cpp_bin_float<1000,цифрой_base_10,std::allocator<92]void>>>>>>>[

Конечные параметры шаблона определяют тип и диапазон экспоненты: параметрЭкспонентможет быть любого подписанного целого типа, но обратите внимание, чтоМинэкспонентиMaxExponentне может идти прямо до пределовЭкспоненттипа, поскольку для внутренних расчетов должен быть небольшой дополнительный запас хода. Вы получите ошибку времени компиляции, если это так. Кроме того, если MinExponent или MaxExponent равны нулю, то библиотека выберет подходящие значения, максимально большие с учетом ограничений типа и потребности в дополнительном запасе для внутренних расчетов.

Существует полная стандартная библиотека иnumeric_limitsподдержка для этого типа.

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

  • По умолчанию построенныеcpp_bin_floats имеют значение нуля.
  • Радикс этого типа равен 2, даже если точность указана как десятичные цифры.
  • Тип поддерживает как бесконечности, так и NaN. Бесконечность генерируется всякий раз, когда результат будет переполнен, и NaN генерируется для любой математически неопределенной операции.
  • Естьstd::числовые ограниченияспециализация для этого типа.
  • Любоечисло, инстанцированное по этому типу, можно конвертировать в любое другоечисло, инстанцированное по этому типу - например, вы можете конвертировать изчисло<cpp_bin_float<50>>>[ Узкие конверсии округляются до ближайших и являютсяявными.
  • Конверсия из строки приводит к тому, чтоstd::runtime_errorвыбрасывается, если строка не может быть интерпретирована как действительное число с плавающей точкой.
  • Все арифметические операции правильно округлены до ближайшего. Конверсии струн и функцияsqrtтакже правильно округлены, но трансцендентные функции (грех, кос, поу, экс и т. д.) не являются.
cpp_bin_float example:
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <boost/math/special_functions/gamma.hpp>
#include <iostream>
int main()
{
   using namespace boost::multiprecision;
   // Operations at fixed precision and full numeric_limits support:
   cpp_bin_float_100 b = 2;
   std::cout << std::numeric_limits<cpp_bin_float_100>::digits << std::endl;
   std::cout << std::numeric_limits<cpp_bin_float_100>::digits10 << std::endl;
   // We can use any C++ std lib function, lets print all the digits as well:
   std::cout << std::setprecision(std::numeric_limits<cpp_bin_float_100>::max_digits10)
      << 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;
   // And since we have an extended exponent range we can generate some really large 
   // numbers here (4.0238726007709377354370243e+2564):
   std::cout << boost::math::tgamma(cpp_bin_float_100(1000)) << std::endl;
   return 0;
}

PrevUpHomeNext

Статья cpp_bin_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:04:41/0.007824182510376/0