![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
FAQsBoost , Math Toolkit 2.5.0 , Chapter 4. Mathematical Constants
|
![]() |
Warning |
---|---|
Мы еще не смоглипроверить, чтовсеконстанты точны при полной произвольной точности, в настоящее время 100 десятичных цифр. Но некоторые ключевые значения, такие как< |
Код, написанный с использованием математических констант, легко переносим даже при использовании различных типов плавающих точек с различной точностью.
Ошибочно ожидать, что результаты вычислений будутидентичными, но вы можете достичьнаилучшей точности для используемого типа с плавающей точкой.
Это не имеет дополнительных затрат для пользователя, но уменьшает раздражающие и часто запутанные и очень трудно отслеживаемые эффекты, вызванные изначально ограниченной точностью вычислений с плавающей запятой.
Безобидным симптомом этого предела является ложная наименее значимая цифра; в худшем случае слегка неточные константы иногда вызывают дикое расхождение итерационных алгоритмов, потому что внутренние сравнения просто не удаются.
См.руководствовыше для обычного использования, но этот часто задаваемый вопрос объясняет внутренние детали, используемые для констант.
Константы хранятся в виде 100 десятичных цифр. Однако некоторые компиляторы не принимают десятичные цифры строк до тех пор, пока это. Таким образом, константа разбивается на две части, причем первая содержит по меньшей мере 128-битную длинную двойную точность (35 десятичных цифр), а для согласованности должна быть в научном формате с подписанным экспонентом.
Вторая часть представляет собой значение константы, выраженное в виде строки, буквальной, точной по меньшей мере до 100 десятичных цифр (на практике это означает по меньшей мере 102 цифры). Опять же для согласованности используют научный формат с подписанным экспонентом.
Для типов с точностью, превышающей длинный двойник, если T является конструируемым<T
>, то он конструируемым из<constchar*
>, то он непосредственно построен из струны, в противном случае мы возвращаемся к lexical_cast, чтобы преобразовать в тип<T
>. (Использование строки необходимо, потому что вы не можете использовать числовую константу, поскольку даже 43 может не иметь достаточного количества цифр).
Так, например, константа, подобная пи, внутренне определяется как
BOOST_DEFINE_MATH_CONSTANT(pi, 3.141592653589793238462643383279502884e+00, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00");
В этом случае значение равно 109 десятичным цифрам, что гарантирует точность 100 десятичных цифр, а показатель равен нулю.
См.определение новых константдля вычисления новых констант.
Подобное макроопределение может быть вставлено в код пользователя там, где это удобно, или в<boost/math/constants.hpp
>, если оно должно быть добавлено в Boost. Математическая библиотека.
Помимо встроенных типов плавающих точек<float
>,<double
>,<long
double
>, существует несколько классов с произвольной точностью плавающих точек, но большинство из них не лицензированы для коммерческого использования.
Эта работа основана на более ранней работе под названием e-float: Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations, in ACM TOMS, {VOL 37, ISSUE 4, (февраль 2011)} (C) ACM, 2011.http://doi.acm.org/10.1145/1916461.1916469e_float, но в настоящее время он рефакторирован и доступен по лицензии Boost в песочнице Boost помноготочности, где он дорабатывается и готовится к рассмотрению.
Большое число, которое является переработкойe_floatКристофера Корманиоса для использования шаблонов выражения для более быстрого исполнения.
НТЛВиктора Шупа имеет фиксированные и произвольные высокоточные фиксированные и плавающие типы. Однако ни один из них не лицензирован для коммерческого использования.
#include <NTL/quad_float.h> // quad precision 106-bit, about 32 decimal digits. using NTL::to_quad_float; // Less precise than arbitrary precision NTL::RR.
Класс NTL<quad_float
>, дающий форму четырехкратной точности, 106-битный значимый и (но без расширенного диапазона экспонент). С совместимым процессором IEC559/IEEE 754, например семейством Intel X86, с 64-разрядным двойным и 53-разрядным значащим, используя значащие значениядвух64-разрядных двойников, если<std::numeric_limits<double>::digits10
>16, то мы получаем примерно в два раза больше точности, поэтому<std::numeric_limits<quad_float>::digits10()
>должно быть 32. (по умолчанию<std::numeric_limits<RR>::digits10()
>должно быть около 40). (что согласуется с экспериментами). Мы выводим константы (включая некоторые шумные биты, приближение к<std::numeric_limits<RR>::max_digits10()
>), добавляя 2 или 3 дополнительных десятичных цифры, поэтому используя<quad_float::SetOutputPrecision(32+
3);
>.
Apple Mac/Darwin использует аналогичныйдвойной106-битный для своего встроенного<longdouble
>типа.
![]() |
Note |
---|---|
Точность всех типов с плавающей точкой< |
Новые проекты должны использоватьBoost.Multiprecision.
Произвольная прецизионная плавающая точка с классом NTL RR по умолчанию составляет 150 бит (около 50 десятичных цифр), используемых здесь с 300 битами для вывода 100 десятичных цифр, что достаточно для многих практических не теоретико-числовых приложений C++.
NTL Библиотека теории чиселне лицензирована для коммерческого использования.
Этот класс используется в Boost. Математика и является вариантом при использовании больших числовых проектов для расчета новых математических констант.
Новые проекты должны использоватьBoost.Multiprecision.
GMPиMPFRтакже использовались для вычисления констант, но лицензированы по лицензииLesser GPLине лицензированы для коммерческого использования.
В ходе обзора был сделан вывод о том, что способ представления констант не отвечает потребностям многих народов. Ни один из предложенных методов не удовлетворял существенному требованию многих пользователей разрешить писать просто<pi
>, а не<pi()
>. Многие научные и инженерные уравнения трудно читать, потому что скобки вызова функции можно спутать со многими другими часто необходимыми скобками. Все предложенные тогда методы обхода скобок не отвечали всем потребностям, зачастую по причине сложности и неприменимости к различным реалистичным сценариям.
Таким образом, простой метод пространства имен, предложенный сам по себе, но отвергнутый в первом обзоре, был добавлен, чтобы позволить пользователям иметь удобный доступ к плавающим, двойным и длинным двойным значениям, но в сочетании с структурой шаблона и функциями, позволяющими одновременно использовать с другими не встроенными типами плавающих точек.
Функциональный механизм был предусмотрен в предыдущих версиях Boost. Математика.
Новый механизм позволяет частично специализироваться. Посмотреть Custom Специализация константы выше. Он также должен разрешать использование с другими пакетами, такими какttmath Bignum C++.
Не здесь, в этом бусте. Сбор математики, потому что физические константы:
В Boost могут быть доступны некоторые физические константы. Подразделения.
Статья FAQs раздела Math Toolkit 2.5.0 Chapter 4. Mathematical Constants может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 4. Mathematical Constants ::
реклама |