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

cpp_dec_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_dec_floathpp>

namespace boost{ namespace multiprecision{
template <unsigned Digits10, class ExponentType = boost::int32_t, class Allocator = void>
class cpp_dec_float;
typedef number<cpp_dec_float<50> > cpp_dec_float_50;
typedef number<cpp_dec_float<100> > cpp_dec_float_100;
}} // namespaces

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

Тип cpp_dec_float можно использовать с фиксированной точностью, указав ненулевой Digits10 параметр шаблона. Типдефы cpp_dec_float_50 и cpp_dec_float_100 обеспечивают арифметические типы с точностью 50 и 100 десятичных знаков соответственно. Необязательно, вы можете указать целочисленный тип для использования для экспоненты, это по умолчанию для 32-битного целочисленного типа, который более чем достаточно велик для подавляющего большинства случаев использования, но более крупные типы, такие как long long, также могут быть указаны, если вам нужен действительно огромный диапазон экспонент. В любом случае ExponentType должен быть встроенным в подписанный целочисленный тип шириной не менее 2 байт и 16 бит.

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

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

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

  • По умолчанию построенные cpp_dec_floats имеют значение нуля.
  • Радикс этого типа составляет 10. В результате он может вести себя несколько иначе, чем базовые 2 типа.
  • Тип имеет ряд внутренних защитных цифр над и над теми, которые указаны в аргументе шаблона. Обычно они не должны быть видны пользователю.
  • Тип поддерживает как бесконечности, так и NaN. Бесконечность генерируется всякий раз, когда результат будет переполнен, и NaN генерируется для любой математически неопределенной операции.
  • Для этого типа существует специализация std::numeric_limits.
  • Любое число число , полученное на этом типе, можно конвертировать в любое другое число <cpp_dec_float<50> > cpp_dec_float< >>>>>>><2 Узкие конверсии усечены и эксплицитно.
  • Преобразование из строки приводит к тому, что std::runtime_error выбрасывается, если строка не может быть интерпретирована как действительное число с плавающей точкой.
  • Фактическая точность cpp_dec_float всегда немного выше, чем число цифр, указанных в параметре шаблона, фактически, насколько выше деталь реализации, но всегда по меньшей мере 8 десятичных цифр.
  • Операции с участием cpp_dec_float всегда усечены. Однако обратите внимание, что, поскольку они являются защитными цифрами, на практике это не оказывает реального влияния на точность в большинстве случаев использования.
cpp_dec_float example:
#include <boost/multiprecision/cpp_dec_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_dec_float_100 b = 2;
   std::cout << std::numeric_limits<cpp_dec_float_100>::digits << std::endl;
   // Note that digits10 is the same as digits, since we're base 10! :
   std::cout << std::numeric_limits<cpp_dec_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_dec_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_dec_float_100(1000)) << std::endl;
   return 0;
}

PrevUpHomeNext

Статья cpp_dec_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:43:12/0.026978015899658/1