Ada (798525), страница 4
Текст из файла (страница 4)
Например:typeUnsigned_Byteis mod 2 ** 8;-- (2 ** 8) = 256typeSigned_Byteis range -128 .. +127;U : Unsigned_Byte := 150;S : Signed_Byte:= Signed_Byte(U);-- здесь будет сгенерировано исключение-Constraint_ErrorЭтот код будет вызывать генерацию исключения Constraint_Error.В следующем параграфе приводятся описания предопределенных модульных типовпредставленных в пакете Interfaces. Заметим, что для этих модульных типов (они описаны сиспользованием двоичной системы счисления) предопределены операции побитного сдвига ивращения.2.2.8 Дополнительные целочисленные типы системы компилятора GNATСтандарт языка Ада допускает определять в реализации Ада-системы собственныедополнительные целочисленные типы. Таким образом, в пакете Standard системы компилятораGNAT определены дополнительные целочисленные типы:typetypetypetypeShort_Short_IntegerShort_IntegerLong_IntegerLong_Long_Integerisisisisrangerangerangerange-(2-(2-(2-(2********7) ..
+(2 ** 7 15) .. +(2 ** 1531) .. +(2 ** 3163) .. +(2 ** 631);- 1);- 1);- 1);Кроме этого, стандарт требует наличия определения дополнительных 8-, 16-, 32- и 64-битныхцелочисленных типов в пакете Interfaces:typetypetypetypeInteger_8Integer_16Integer_32Integer_64isisisisrangerangerangerangetypetypetypetypeUnsigned_8Unsigned_16Unsigned_32Unsigned_64isisisismodmodmodmod-2-2-2-22222** 7 .. 2** 15 .. 2** 31 ..
2** 63 .. 2** 7 - 1;** 15 - 1;** 31 - 1;** 63 - 1;** 8;** 16;** 32;** 64;2.3 Вещественные типыАда предусматривает два способа представления вещественных чисел: представлениевещественных величин с плавающей точкой и представление вещественных величин сфиксированной точкой. Кроме этого вы можете использовать типы вещественных величин сдесятичной фиксированной точкой.2.3.1 Вещественные типы с плавающей точкой, тип FloatВещественные типы с плавающей точкой имеют неограниченный диапазон значений и точность,определяемую количеством десятичных цифр после запятой.
Представление чисел с плавающейточкой имеет фиксированную относительную погрешность.Пакет Standard предоставляет предопределенный вещественный тип с плавающей точкойFloat, который обеспечивает точность в шесть десятичных цифр после запятой:typeFloatis digits 6 range -16#0.FFFF_FF#E+32 ..
16#0.FFFF_FF#E+32;--3.40282E+38 .. 3.40282E+38В пакете Standard компилятора GNAT, для 32-битных систем Linux и Windows, дополнительнопредставлены еще несколько вещественных типов с плавающей точкой (фактические значенияконстант для различных платформ отличаются):typeShort_Floatis digits 6range -16#0.FFFF_FF#E+32 .. 16#0.FFFF_FF#E+32;-- -3.40282E+38 .. 3.40282E+38typeLong_Floatis digits 15range -16#0.FFFF_FFFF_FFFF_F8#E+256 .. 16#0.FFFF_FFFF_FFFF_F8#E+256;-- -1.79769313486232E+308 .. 1.79769313486232E+308typeLong_Long_Float is digits 18range -16#0.FFFF_FFFF_FFFF_FFFF#E+4096 .. 16#0.FFFF_FFFF_FFFF_FFFF#E+4096;---1.18973149535723177E+4932 ..1.18973149535723177E+4932Ниже следуют примеры описаний вещественных величин с плавающей точкой.XA, B, CPiAvogadro::::Float;Float;constant Float := 3.14_2;constant := 6.027E23;-- тип Universal_Floatsubtype Temperatures is Float range 0.0..100.0;type Result is new Float range 0.0..20_000.0;type Velocity is new Float;type Height is new Float;-- нельзя случайно смешивать Velocity и Height-- без явного преобразования типов.type Time is digits 6 range 0.0..10_000.0;-- в этом диапазоне требуемая точность - шесть десятичных цифр-- после точкиtype Degrees is digits 2 range -20.00..100.00;-- требуемая точность - две десятичных цифры после точкиСледующие знаки операций предопределены для каждого вещественного типа с плавающейточкой.+, -, *, /**absвозведение в степень (только целые значения степени)абсолютное значение2.3.2 Вещественные типы с фиксированной точкой, тип DurationПредставление чисел с фиксированной точкой имеет более ограниченный диапазон значений иуказанную абсолютную погрешность, которая задается как delta этого типа.В пакете Standard предоставлен предопределенный вещественный тип с фиксированной точкойDuration, который используется для представления времени и обеспечивает точностьизмерения времени в 50 микросекунд:type Duration is delta 0.000000001range -((2 ** 63 - 1) * 0.000000001) ..+((2 ** 63 - 1) * 0.000000001);Ниже следуют примеры описаний вещественных типов с фиксированной точкой.type Volt is delta 0.125 range 0.0 ..
255.0;type Fraction is delta System.Fine_Delta range -1.0..1.0;-- Ada95-- Fraction'Last = 1.0 - System.Fine_DeltaПоследний пример показывает полезную способность вещественных типов с фиксированнойточкой - четкое определение насколько тип должен быть точным. Например, это позволяетконтролировать ошибки, возникающие при округлении.2.3.3 Вещественные типы с десятичной фиксированной точкойСледует учитывать, что поскольку от реализации компилятора Ады не требуется обязательноеобеспечение поддержки вещественных величин с десятичной фиксированной точкой, то этоможет вызвать трудности при переносе программного обеспечения на другую систему или прииспользовании разных компиляторов.Примером описания вещественного типа с десятичной фиксированной точкой может служитьследующее:type Money is delta 0.01 digits 15; -- десятичная фиксированная точка,-- здесь величина, задаваемая в delta,-- должна быть степенью 10subtype Salary is Money digits 10;2.3.4 Типы Universal_Float и Root_RealПодобно тому как все целочисленные литералы принадлежат универсальному классуUniversal_Integer, все вещественные численные литералы принадлежат универсальномуклассу Universal_Float.
Этот универсальный тип совместим с любым вещественным типомс плавающей точкой и любым вещественным типом с фиксированной точкой. Такой подходизбавляет от необходимости выполнения различных преобразований типов при описаниивещественных констант и переменных.Модель вещественной арифметики Ады основывается на анонимном типе Root_Real. Этотанонимный тип используется как базовый тип для всех вещественных типов. Тип Root_Realимеет точность, которая определяется значением константы Max_Base_Digits пакета System(System.Max_Base_Digits).
Такой подход использован для облегчения переносимостипрограмм.2.3.5 Пакеты для численной обработкиПолное обсуждение поддержки численной обработки в Аде - весьма обширная тема. Поэтомуздесь, чтобы указать "куда бежать дальше", мы только приведем список пакетов для численнойобработки, которые предоставляются поставкой компиляора GNAT:Ada.NumericsAda.Numerics.AuxAda.Numerics.Float_RandomAda.Numerics.Discrete_RandomAda.Numerics.Complex_TypesAda.Numerics.Complex_Elementary_FunctionsAda.Numerics.Elementary_FunctionsAda.Numerics.Generic_Complex_TypesAda.Numerics.Generic_Complex_Elementary_FunctionsAda.Numerics.Generic_Elementary_FunctionsAda.Numerics.Long_Complex_TypesAda.Numerics.Long_Complex_Elementary_FunctionsAda.Numerics.Long_Elementary_FunctionsAda.Numerics.Long_Long_Complex_TypesAda.Numerics.Long_Long_Complex_Elementary_FunctionsAda.Numerics.Long_Long_Elementary_FunctionsAda.Numerics.Short_Complex_TypesAda.Numerics.Short_Complex_Elementary_FunctionsAda.Numerics.Short_Elementary_FunctionsСледует заметить, что пакет Ada.Numerics.Aux, который указан выше, не предназначен длянепосредственного использования в программах пользователя, и упоминается только с цельюполноты показанного выше списка.2.4 Преобразование численных типовПоскольку тип Float и тип Integer - различные типы, то Ада не допускает смешиваниявеличин этих типов в одном выражении.
Однако, встречаются случаи, когда нам необходимокомбинировать значения этих типов. В таких ситуациях нам необходимо производитьпреобразование значений одного численного типа в значения другого численного типа.Ада позволяет явно указывать необходимость преобразования значения типа Float в значениетипа Integer, и наоборот. Для выполнения такого преобразования используется синтаксисподобный синтаксису вызова функции:X : Integer := 4;Y : Float;Y := Float(X);...X := Integer(Y);В этом случае компилятор, во время трансляции, добавит необходимый код для преобразованиятипов. Такое преобразование типов всегда возможно, и будет успешным если значениерезультата не будет нарушать границ допустимого диапазона значений.Следует заметить, что при преобразовании вещественного значения Float в целое значениеInteger Ада использует традиционные для математики правила округления, то есть:Значение FloatОкругленное значение Integer1.521.31-1.5-2-1.3-12.5 Перечислимые типыДо настоящего момента были рассмотрены типы данных которые представляли численныезначения (целые и вещественные числа).
Однако, при решении многих практических задач,важное значение имеет понятие перечислимого типа. Перечислимыми типами называют такиетипы данных значения которых перечислены, то есть представлены списком некоторыхзначений. Перечислимый тип полезен когда необходимо представить фиксированное множествозначений, которые не являются числами. Примером может служить представление дней неделиили месяцев в году.2.5.1 Описание перечислимого типаПеречислимый тип описывается путем предоставления списка всех возможных значенийданного типа в виде идентификаторов (другими словами, перечислением всех возможныхзначений данного типа). Например:type Computer_Language is (Assembler, Cobol, Lisp, Pascal, Ada);type C_Letter_Languages is (Cobol, C);После такого описания типов, константы и переменные этих типов могут быть описаныследующим образом:A_LanguageEarly_LanguageFirst_LanguageExample::::Computer_Language;Computer_Language := Cobol;constant Computer_Language := Assembler;C_Letter_Language := Cobol;Необходимо заметить, что порядок перечисления значений типа, при описании перечислимоготипа, имеет самостоятельное значение - он устанавливает отношение порядка следованиязначений перечислимого типа, которое используется атрибутами 'First, 'Last, 'Pos, 'Val,'Pred, 'Succ (см "Атрибуты типов"), а также при сравнении величин перечислимого типа.Так, для типа Computer_Language, описанного в примере выше, значение Assembler будетменьше чем значение Cobol.В одной программе допускается использование одного и того же перечислимого литерала вописаниях различных перечислимых типов.
Так, в показанном выше примере, литерал Cobolвстречаетсяприописаниидвухразныхтипов:Computer_LanguageиC_Letter_Languages. Такие литералы называют совмещенными (или перегруженными).При этом, Ада, в большинстве случаев, распознает одинаковые перечислимые литералыразличных перечислимых типов. В случаях, когда это не возможно - необходимо использоватьквалификацию типов.Рассмотрим следующий пример:type Primary is (Red, Green, Blue);type Rainbow is (Red, Yellow, Green, Blue, Violet);...for I in Red..Blue loop ...-- это двусмысленноЗдесь, компилятор не может самостоятельно определить к какому из двух типов (Primary илиRainbow) принадлежит диапазон значений Red..Blue переменной цикла I (литералы Red иBlue - совмещены). Поэтому, в подобных случаях, нам необходимо точно указывать требуемыйтип, используя квалификацию типа:for I in Rainbow'(Red)..Rainbow'(Blue) loop ...for I in Rainbow'(Red)..Blue loop ...-- необходима только одна квалификацияfor I in Primary'(Red)..Blue loop ...Квалификация типа не изменяет значения типа и не выполняет никаких преобразований типа.Она только информирует компиляор о том какой тип, в данном случае, подразумеваетпрограммист.При описании перичислимых типов, для указания значений перечислимого типа также как исимволические имена, допускается использовать символьные константы.
В этом случаеперечислимый тип будет символьным (см. "Символьные типы Ады").В заключение обсуждения описания перечислимых типов, заметим, что перечислимые ицелочисленные типы называют дискретными типами, потому что они описывают множестваупорядоченных дискретных значений.