![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
DefinitionsBoost , Chapter 1. Boost.NumericConversion , Chapter 1. Boost.NumericConversion
В этом разделе приведены определения терминов, используемых в библиотеке численного преобразования. Как определеноC++ Объектная модель(§1.7)хранилищеили память, на которой работает программа C++, представляет собой непрерывную последовательностьбайтов, где каждый байт представляет собой непрерывную последовательность битов. Объектявляется областью хранения (§1.8) и имеет тип (§3.9). Типпредставляет собой дискретный набор значений. Объект типа Объект типа типизированное значение, удерживаемое объектом, является значением, которое определяется его представлением стоимости. Абстрактное значение(нетипированное) представляет собой концептуальную информацию, представленную в виде типа (т.е. число π). Внутренняя величинаобъекта является двоичной величиной последовательности неподписанных символов, которые образуют его объектное представление. Абстрактныезначения могут бытьпредставленыв данном типе. Дляпредставленияабстрактного значения Операция обозначается с помощью оператора Например, абстрактное значение π может быть представлено в типе И наоборот,типизированные значениямогут бытьабстрагированы. Дляабстрактноготипизированного значения Операция обозначается с использованием оператора
Абстракция — это просто абстрактная операция (вы не можете сделать это), но она определена тем не менее, потому что она будет использоваться, чтобы дать определения в остальной части этого документа. Язык C++ определяетфундаментальные типы(§3.9.1). Следующие подмножества основных типов предназначены для представлениячисел:
Целые типы должны иметьдвоичноепредставление значений. Кроме того, подписанные/неподписанные целые типы одного и того же базового типа int i = -3 ; // suppose value representation is: 10011 (sign bit + 4 magnitude bits) unsigned int u = i ; // u is required to have the same 10011 as its value representation. Другими словами, целые типы, подписанные/неподписанные X, используют одно и то же представление значений, но различнаяинтерпретацияиз него; то есть ихтипизированные значениямогут отличаться. Другим следствием этого является то, что диапазон для подписанного X всегда является меньшим подмножеством диапазона неподписанного X, как того требует §3.9.1/3.
В этом разделе представлены следующие определения, предназначенные для интеграции арифметических типов с определяемыми пользователем типами, которые ведут себя как числа. Некоторые определения специально широки для того, чтобы включать в себя огромное разнообразие определяемых пользователем типов чисел. В этой библиотеке терминчислоотносится к абстрактному числовому значению. Типчисловой, если:
Цифровой типподписан, если абстрактные значения, которые он представляет, включают отрицательные числа. Цифровой тип —неподписанный, если абстрактные значения, которые он представляет, исключают отрицательные числа. Цифровой тип —modulo, если он имеет модульно-арифметический (не переполнен). Численным типом являетсяцелое число, если абстрактные значения, которые оно представляет, являются целыми числами. Цифровой типплавающий, если абстрактные значения, которые он представляет, являются реальными числами. арифметическое значениеявляется типизированным значением арифметического типа Числовое значениеявляется типизированным значением числового типа. Эти определения просто обобщают стандартные понятия арифметических типов и значений, вводя супермножество, называемоечислом. Все арифметические типы и значения являются числовыми типами и значениями, но не наоборот, поскольку определяемые пользователем числовые типы не являются арифметическими типами. Следующие примеры разъясняют различия между арифметическими и числовыми типами (и значениями): // A numeric type which is not an arithmetic type (is user-defined) // and which is intended to represent integer numbers (i.e., an 'integer' numeric type) class MyInt { MyInt ( long long v ) ; long long to_builtin(); } ; namespace std { template<> numeric_limits<MyInt> { ... } ; } // A 'floating' numeric type (double) which is also an arithmetic type (built-in), // with a float numeric value. double pi = M_PI ; // A 'floating' numeric type with a whole numeric value. // NOTE: numeric values are typed valued, hence, they are, for instance, // integer or floating, despite the value itself being whole or including // a fractional part. double two = 2.0 ; // An integer numeric type with an integer numeric value. MyInt i(1234); При наличии набора номеров Набор репрезентабельных значений типа Например, интервал Аналогично, интервал Пусть Пусть Пусть Упорядоченная пара числовых значений Абстрактное расстояние между последовательными числовыми значениями обычно называют. Единица в последнем местеилиulpдля краткости. Ульп – это величина, абстрактная величина которой по отношению к числовым значениям соответствует: Если числовой набор не распределен равномерно, то есть если абстрактное расстояние между последовательными числовыми значениями изменяется вдоль множества - как в случае с типами с плавающей точкой - величина 1ulp после числового значения Поскольку числа по своей природе упорядочены,числовой набортипа REP(T)={l,next(l),next(next(l)),...,prev(prev(h)),prev(h),h} где Цифровой набор является дискретным. Он имеетразмер, который является числом числовых значений в множестве,ширина, который является абстрактной разницей между самыми высокими и самыми низкими граничными значениями: Целые типы имеют плотность 1, что означает, что нет непредставимых целых чисел между Интервалабстрактных значений Диапазон — это набор абстрактных значений, а не набор числовых значений. В других документах, таких как стандарт C++, слово Например, последовательность Обратите внимание, например, что диапазон типа с плавающей точкойнепрерывныйв отличие от его числового набора. Это определение было выбрано потому, что:
Это определение позволяет дать краткое определение Ширина числового множества, как определено, точно эквивалентна ширине диапазона. Точностьтипа определяется шириной или плотностью числового множества. Для целых типов, которые имеют плотность 1, точность концептуально эквивалентна диапазону и определяется количеством битов, используемых в представлении значений: Чем больше число битов, тем больше размер числового набора, тем шире диапазон и тем выше точность. Для плавающих типов, имеющих плотность<<1, точность задается не шириной диапазона, а плотностью. В типичной реализации диапазон определяется количеством битов, используемых в экспоненте, и точностью по количеству битов, используемых в мантиссе (придавая максимальное количество значащих цифр, которые могут быть точно представлены). Чем больше число экспонентных битов, тем шире диапазон, в то время как чем больше число битов мантисы, тем выше точность. Дано абстрактное значение Если
Если Обратите внимание, что числовой тип, такой как C++ неподписанный тип, может определять, что любой Учитывая абстрактное значение Обратите внимание, что представление является операцией, следовательно, ошибка округления соответствует операции представления, а не самому числовому значению (т.е. сами числовые значения не имеют никакой ошибки).
Если представление Все точные представления правильно округлены, но не все неточные представления. В частности, C++ требует, чтобы численные преобразования (описанные ниже) и результат арифметических операций (не охваченный этим документом) были правильно округлены, но пакетные операции распространяют округление, таким образом, конечные результаты обычно неправильно округлены, то есть численное значение Поскольку правильно округленное представление всегда является одним из смежных представленных абстрактных значений, округление гарантированно будет максимальным 1ulp. Следующие примеры обобщают приведенные определения. Подумайте:
Во-первых, обратите внимание, что типы
Язык C++ определяетСтандартные преобразования(§4), некоторые из которых являются преобразованиями между арифметическими типами. Этоинтегральные рекламные акции(§4.5),интегральные конверсии(§4.7),промо-акции с плавающей точкой(§4.6),конверсии с плавающей точкой(§4.8) иплавающие интегральные конверсии(§4.9). В продолжении интегральные и плавающие точечные промо-акции называютсяарифметические промо-акции, и эти плюс интегральные, плавающие точечные и плавающие интегральные конверсии называютсяарифметические конверсии(т.е. промо-акции являются конверсиями). Рекламные акции, как интегральные, так и плавающие точкизначение-сохранение, что означает, что типизированное значение не изменяется с преобразованием. В продолжении рассмотрим исходное типизированное значение Целое число для целых преобразований всегда определяется:
Плавающие преобразования определяются только в том случае, если
Преобразования в целых числах представляют собой не
Целое число для плавающих конверсий всегда определяется.
Учитывая тип источника Для любых двух диапазонов можно определить следующееотношение диапазона: диапазон
Если диапазон типа источника, Примеры: Учитывая следующие числовые типы, все они представляют реальные числа:
Для:
Возможно, что Учитывая отношение диапазона (субранжированного или нет) направления преобразования Например:
Если
Обратите внимание, что хотя Теперь рассмотрим:
Требуется реализация C++
При этом конверсия субранжируется в обоих направлениях и пары супертипа, подтипа не инвариантны (при инверсии направления). Это означает, что ни один из типов не может представлять все значения другого. Когда супертип одинаков для Статья Definitions раздела Chapter 1. Boost.NumericConversion Chapter 1. Boost.NumericConversion может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Chapter 1. Boost.NumericConversion ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |