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

Definitions

Boost , Chapter 1. Boost.NumericConversion , Chapter 1. Boost.NumericConversion

Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

В этом разделе приведены определения терминов, используемых в библиотеке численного преобразования.

Как определеноC++ Объектная модель(§1.7)хранилищеили память, на которой работает программа C++, представляет собой непрерывную последовательностьбайтов, где каждый байт представляет собой непрерывную последовательность битов.

Объектявляется областью хранения (§1.8) и имеет тип (§3.9).

Типпредставляет собой дискретный набор значений.

Объект типаTимеетпредставление объекта, которое представляет собой последовательность байтов, хранящихся в объекте (§3.9/4).

Объект типаTимеетпредставление значений, которое представляет собой набор битов, определяющихзначениеобъекта этого типа (§3.9/4). Длятипов POD(§3.9/10) этот битет задается представлением объекта, но не все биты в хранилище должны участвовать в представлении значения (за исключением типов символов): например, некоторые биты могут использоваться для прокладки или могут быть трап-биты.

space

типизированное значение, удерживаемое объектом, является значением, которое определяется его представлением стоимости.

Абстрактное значение(нетипированное) представляет собой концептуальную информацию, представленную в виде типа (т.е. число π).

Внутренняя величинаобъекта является двоичной величиной последовательности неподписанных символов, которые образуют его объектное представление.

space

Абстрактныезначения могут бытьпредставленыв данном типе.

Дляпредставленияабстрактного значенияVв типеTнеобходимо получить типизированное значениеv, которое соответствует абстрактному значениюV.

Операция обозначается с помощью оператораrep, как в:v=repVvявляетсяпредставлениемVв типеT.

Например, абстрактное значение π может быть представлено в типедвойнойкакдвойнойзначениеM_PIи в типеintкакintзначение3.

space

И наоборот,типизированные значениямогут бытьабстрагированы.

Дляабстрактноготипизированного значенияvтипаTявляется получение абстрактного значенияV, представление которого вTявляетсяv.

Операция обозначается с использованием оператораabt[], как в:V=abtv.

V— это.абстракцияvтипаT.

Абстракция — это просто абстрактная операция (вы не можете сделать это), но она определена тем не менее, потому что она будет использоваться, чтобы дать определения в остальной части этого документа.

Язык C++ определяетфундаментальные типы(§3.9.1). Следующие подмножества основных типов предназначены для представлениячисел:

signed integer types (§3.9.1/2):

подписан,подписанкороткийintподписанподписанподписанподписанподписанподписан]подписан]Может использоваться для представления общих целых чисел (как отрицательных, так и положительных).

unsigned integer types (§3.9.1/3):

,неподписанныйкороткийint,неподписанныйнеподписанныйнеподписанныйдлинныйintМожет использоваться для представления положительных целых чисел с модуло-арифметикой.

floating-point types (§3.9.1/8):

{плавать,двойной,длинныйдвойной}Можно использовать для представления реальных чисел.

integral or integer types (§3.9.1/7):

{{подписанныецелые числа},неподписанныецелые числа},болт,чарwchar_t}

arithmetic types (§3.9.1/8):

{{целые числатипы},плавающиетипы}}

Целые типы должны иметьдвоичноепредставление значений.

Кроме того, подписанные/неподписанные целые типы одного и того же базового типакороткие,intилидлинные] должны иметь одинаковое представление значений, то есть:

         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.

[Note] Note

Всегда помните, что неподписанные типы, в отличие от подписанных типов, имеют модульно-арифметический характер, то есть не переполняются. Это означает, что:

-Всегда будьте особенно осторожны при смешивании подписанных / неподписанных типов.

-Используйте неподписанные типы только тогда, когда вам нужна арифметика модуля или очень большие числа. Не используйте неподписанные типы только потому, что вы намерены иметь дело только с положительными значениями (вы можете сделать это с подписанными типами).

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

В этой библиотеке терминчислоотносится к абстрактному числовому значению.

Типчисловой, если:

  • Это арифметический тип, или
  • Это тип, определяемый пользователем
      .
    • Представляет собой числовые абстрактные значения (т.е. числа).
    • Может быть преобразован (явно или неявно) в/из по меньшей мере одного арифметического типа.
    • Имеетдиапазон(возможно неограниченный) иточность(возможно динамический или неограниченный).
    • Предоставляет специализациюstd::numeric_limits.

Цифровой типподписан, если абстрактные значения, которые он представляет, включают отрицательные числа.

Цифровой тип —неподписанный, если абстрактные значения, которые он представляет, исключают отрицательные числа.

Цифровой тип —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);

При наличии набора номеровNнекоторые его элементы представляются в численном видеT.

Набор репрезентабельных значений типаT, или числовой наборT, представляет собой набор числовых значений, элементы которых представляют некоторое подмножествоN.

Например, интервалintзначенийINT_MIN,INT_MAXint, т.е.intцифрового множества, и соответствует представлению элементов интервала абстрактных значенийabtINT_MIN,abtINT_MAXот целых чисел.

Аналогично, интервалдвойныхзначений[-DBL_MAXDBL_MAXявляетсядвойнымчисловым множеством, которое соответствует подмножеству реальных чисел отabtabtDBL_MAX.

space

Пустьследующаяxобозначает наименьшее численное значение, превышающее x.

Пустьprevx]обозначают самое высокое числовое значение ниже, чем x.

Пусть[следующий]и=] являются тождествами, которые относятся к численному типизированному значениюс числом [5

Упорядоченная пара числовых значенийx,ys.t.x<уявляютсяпоследовательнымиследующимx] ==у.

Абстрактное расстояние между последовательными числовыми значениями обычно называют. Единица в последнем местеилиulpдля краткости. Ульп – это величина, абстрактная величина которой по отношению к числовым значениям соответствует: Если числовой набор не распределен равномерно, то есть если абстрактное расстояние между последовательными числовыми значениями изменяется вдоль множества - как в случае с типами с плавающей точкой - величина 1ulp после числового значенияxможет (обычно) отличаться от величины 1ulp после числового значения y дляx!=y.

Поскольку числа по своей природе упорядочены,числовой набортипаTпредставляет собой упорядоченную последовательность числовых значений (типаT) формы:

REP(T)={l,next(l),next(next(l)),...,prev(prev(h)),prev(h),h}

гдеlиhсоответственно являются самыми низкими и самыми высокими значениями типаT, называемыми граничными значениями типаT.

space

Цифровой набор является дискретным. Он имеетразмер, который является числом числовых значений в множестве,ширина, который является абстрактной разницей между самыми высокими и самыми низкими граничными значениями:abth-abt.

Целые типы имеют плотность 1, что означает, что нет непредставимых целых чисел междуabtlиabth(т.е. нет зазоров). С другой стороны, плавающие типы имеют плотность намного меньше 1, что означает, что между последовательными плавающими значениями существуют реальные числа, непредставленные (т.е. есть промежутки).

space

Интервалабстрактных значенийabtl,abth]является диапазоном типаT, обозначаемогоRT.

Диапазон — это набор абстрактных значений, а не набор числовых значений. В других документах, таких как стандарт C++, словодиапазониногдаиспользуется как синонимцифровогонабора, то есть как упорядоченная последовательность числовых значений отlдоh. В этом документе, однако, диапазон является абстрактным интервалом, который субтендирует числовой набор.

Например, последовательность[-DBL_MAXDBL_MAXявляется числовым набором типадвойной, а реальный интервалabtDBL_MAXabtDBL_MAX]является его диапазоном.

Обратите внимание, например, что диапазон типа с плавающей точкойнепрерывныйв отличие от его числового набора.

Это определение было выбрано потому, что:

  • (a)Дискретный набор числовых значений уже задан числовым множеством.
  • (b)Абстрактные интервалы легче сравнивать и перекрывать, поскольку необходимо учитывать только граничные значения.

Это определение позволяет дать краткое определениеподгруппированного, как указано в последнем разделе.

Ширина числового множества, как определено, точно эквивалентна ширине диапазона.

space

Точностьтипа определяется шириной или плотностью числового множества.

Для целых типов, которые имеют плотность 1, точность концептуально эквивалентна диапазону и определяется количеством битов, используемых в представлении значений: Чем больше число битов, тем больше размер числового набора, тем шире диапазон и тем выше точность.

Для плавающих типов, имеющих плотность<<1, точность задается не шириной диапазона, а плотностью. В типичной реализации диапазон определяется количеством битов, используемых в экспоненте, и точностью по количеству битов, используемых в мантиссе (придавая максимальное количество значащих цифр, которые могут быть точно представлены). Чем больше число экспонентных битов, тем шире диапазон, в то время как чем больше число битов мантисы, тем выше точность.

Дано абстрактное значениеVи типTс соответствующим диапазономabtl,abth:

ЕслиV<lV>abthV(не может быть представлено] в типеT, или, эквивалентно, это представление в типеTявляетсявне диапазонаилипереполнения.

  • ЕслиV<abtl, топереполнение отрицательно.
  • ЕслиV>abth, топереполнение положительно.

ЕслиV>=abtl[10013] иV<=abth[10013],Vявляетсярепрезентабельным(может быть представлено] в типеTявляетсяв диапазоне, илине переполняется.

Обратите внимание, что числовой тип, такой как C++ неподписанный тип, может определять, что любойVне переполняется, всегда представляя неVсебя, а абстрактное значениеU=V%abth1, которое всегда находится в диапазоне.

Учитывая абстрактное значениеV, представленное в типеTкакv,округлениепогрешность представления является абстрактной разницей:abtvV.

Обратите внимание, что представление является операцией, следовательно, ошибка округления соответствует операции представления, а не самому числовому значению (т.е. сами числовые значения не имеют никакой ошибки).

  • Если округление равно 0, то представлениеточно, аVточно представлено в типеT.
  • Если округление не равно 0, то представлениенеточно, аVнеточно представлено в типеT.

Если представлениеvв типеT- либо точное, либо неточное - является любым из смежностейVв этом типе, то есть еслиv==prevилиv==следующий, представление точно округлено. Если выбор междуprevиследующимсоответствует заданномуокругленному направлению, то этоправильно округленное.

Все точные представления правильно округлены, но не все неточные представления. В частности, C++ требует, чтобы численные преобразования (описанные ниже) и результат арифметических операций (не охваченный этим документом) были правильно округлены, но пакетные операции распространяют округление, таким образом, конечные результаты обычно неправильно округлены, то есть численное значениеr, которое является вычисленным результатом, не является ни одним из смежных абстрактного значенияR, которое является теоретическим результатом.

Поскольку правильно округленное представление всегда является одним из смежных представленных абстрактных значений, округление гарантированно будет максимальным 1ulp.

Следующие примеры обобщают приведенные определения. Подумайте:

  • Численный типInt, представляющий целые числа счисловым набором:{-2,-1,0,1,] и2,2[1202
  • Численный типКардинал, представляющий целые числа:,,2,,,[1250
  • Численный типРеал, представляющий реальные числа счисленным набором:2.0, -1.5, -0,5, -0,0, +, +, +, +[13
  • Численный типЦелый, представляющий реальные числа счисловым набором:{-2.0,-1.0,0,0,1.0, +2,0[13

Во-первых, обратите внимание, что типыРеальиВсе числапредставляют собой действительные числа, имеют одинаковый диапазон, но разную точность.

  • Целое число1(абстрактное значение) может быть точно представлено в любом из этих типов.
  • Целое число-1может быть точно представлено вInt,RealиWhole, но не может быть представлено вкардинале, что приводит к отрицательному переполнению.
  • Реальное число1.5может быть точно представлено вРеальноми неточно представлено в других типах.
  • Если1.5представлено как1или2в любом из типов (кромеРеальный), представление правильно округлено.
  • Если0,5представлено как+1,5в типеРеал, то оно неправильно округлено.
  • [-являются[2,0]], но нет

Язык C++ определяетСтандартные преобразования(§4), некоторые из которых являются преобразованиями между арифметическими типами.

Этоинтегральные рекламные акции(§4.5),интегральные конверсии(§4.7),промо-акции с плавающей точкой(§4.6),конверсии с плавающей точкой(§4.8) иплавающие интегральные конверсии(§4.9).

В продолжении интегральные и плавающие точечные промо-акции называютсяарифметические промо-акции, и эти плюс интегральные, плавающие точечные и плавающие интегральные конверсии называютсяарифметические конверсии(т.е. промо-акции являются конверсиями).

Рекламные акции, как интегральные, так и плавающие точкизначение-сохранение, что означает, что типизированное значение не изменяется с преобразованием.

В продолжении рассмотрим исходное типизированное значениеsтипаS, исходное абстрактное значениеN=abts, конечный типT; и, по возможности, результат типизированное значениеtтипаT.

Целое число для целых преобразований всегда определяется:

  • ЕслиTне подписан, абстрактное значение, которое эффективно представлено, неN=N%abth+1, гдеhявляется самым высоким неподписанным типизированным значением типаT.
  • ЕслиTподписан иNнепосредственно не репрезентируем, то результатомtявляетсяреализация-определенная, что означает, что реализация C++ требуется для получения значенияt, даже если оно полностью не связано сs.

Плавающие преобразования определяются только в том случае, еслиNявляется репрезентабельным; если это не так, то конверсия имеетнеопределенное поведение.

  • ЕслиNявляется точно представляемым,tтребуется точное представление.
  • ЕслиNявляется неточно репрезентируемым,tтребуется быть одним из двух смежных, с реализацией-определенным выбором направления округления; то есть преобразование необходимо правильно округлить.

Преобразования в целых числах представляют собой неN, аM=усечениеN, былиусечениеявляется усечением: то есть удаление фракционной части, если таковая имеется.

  • ЕслиMне представляется вT, то преобразование имеетнеопределенное поведение(еслиTне является, см. §4.12).

Целое число для плавающих конверсий всегда определяется.

  • ЕслиNявляется точно представляемым,tтребуется точное представление.
  • ЕслиNявляется неточно репрезентируемым,tтребуется быть одним из двух смежных, с реализацией-определенным выбором направления округления; то есть преобразование необходимо правильно округлить.

Учитывая тип источникаSи тип назначенияT, существуетнаправление преобразованияобозначается:S->T.

Для любых двух диапазонов можно определить следующееотношение диапазона: диапазонXможет быть, полностью содержащийсяв диапазонеY, и в этом случае говорится, чтоXзаключен вY.

Формально:RRTiifR[1807

Если диапазон типа источника,RRTR&RT[1862 Другими словами, если направление конверсииS->Tсубранжировано, то вSсуществуют значения, которые не могут быть представлены вT, поскольку они находятся вне диапазона. Обратите внимание, что дляS->Tприлагательное подранжируется кT.

Примеры:

Учитывая следующие числовые типы, все они представляют реальные числа:

  • Xс числовым набором2.0, -1.0,0,0, +1.0, +2.0и диапазон2.02.0
  • Yс числовым набором2.0, -1.5, -1.0, -0,5,0,0, +0.5, +1.0, +2,0и диапазон2,02,0
  • Zс числовым набором{-1.0,0,0, +1.0]]и диапазон[-1.01.0

Для:

(a) X->Y:

RX]&RY==RX, затемX->Yне подгруппирован. Таким образом, все значения типаXпредставляются в типеY.

(b) Y->X:

RY]&RX==RY, затемY->Xне подгруппирован. Таким образом, все значения типаYпредставляются в типеX, но в этом случае некоторые значения являютсянеточнопредставляемыми (все половинки). (Примечание: в данном случае диапазон представляет собой интервал абстрактных значений, а не интервал типизированных значений).

(b) X->Z:

RX]&RZ]!=RXX—>Zнаходится в подгруппе. Таким образом, некоторые значения типаXне представляются в типеZ, они выпадают из диапазона[-2.0и+2.0.

Возможно, чтоRRTRS=[2251 Это означает, что направление конверсии может быть разделено в обе стороны. Это происходит, когда задействована смесь подписанных/неподписанных типов и указывает, что в обоих направлениях есть значения, которые могут выпасть из диапазона.

Учитывая отношение диапазона (субранжированного или нет) направления преобразованияS->T, можно классифицироватьSиTкаксупертипиподтип: Если преобразование подгруппировано, что означает, чтоTне может представлять все возможные значения типаS,Sявляется супертипом иTподтипом; в противном случаеTявляется супертипом иSподтипом.

Например:

Rплавающий] = [-FLT_MAX,FLT_MAXиRдвойнойDBL_MAXDBL_MAX

ЕслиFLT_MAX<DBL_MAX:

  • двойной->поплавокявляется подгруппированным исупертип=двойной,подтип=поплавок.
  • поплавок->двойнойне является подгруппированным исупертип=двойной,подтип=поплавок.

Обратите внимание, что хотядвойной->поплавоксубранжируется,поплавок->двойнойне является, что дает один и тот же супертип, подтип для обоих направлений.

Теперь рассмотрим:

Rint] =INT_MIN,INT_MAXиRнеподписанныйint0,UINT_MAX

Требуется реализация C++.UINT_MAX>INT_MAX(§3.9/3), так что:

  • 'int->unsigned' является поддиапазонным (отрицательные значения выпадают из диапазона) исупертип=int,подтип=неподписанный.
  • 'unsigned->int' isalsosubranged (высокие положительные значения выпадают из диапазона) andsupertype=unsigned,subtype=int.

При этом конверсия субранжируется в обоих направлениях и пары супертипа, подтипа не инвариантны (при инверсии направления). Это означает, что ни один из типов не может представлять все значения другого.

Когда супертип одинаков дляS->TиT->S, он фактически указывает тип, который может представлять все значения подтипа. Следовательно, если преобразованиеX->YY->Xявляется таковым, что супертип всегдаY, то говорят, что направлениеX->Yявляется, что означает, что все такие преобразования гарантированно дают результаты в диапазоне и правильно округлены (даже если неточны). Например, все целые числа для плавающих преобразований правильно округлены, сохраняя значение.


PrevUpHomeNext

Статья Definitions раздела Chapter 1. Boost.NumericConversion Chapter 1. Boost.NumericConversion может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 1. Boost.NumericConversion ::


реклама


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

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