Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

A.10.9 Ввод-вывод для вещественных типов

Статические семантики

Следующие процедуры определены в обобщённых пакетах Float_IO, Fixed_IO и Decimal_IO, которые должны быть инстанцированы для соответствующего типа с плавающей запятой, обычного типа с фиксированной запятой или десятичного типа с фиксированной запятой соответственно (указано Num в спецификациях).
Значения выводятся как десятичные литералы без нижних подчёркиваний. Формат каждого выводимого значения состоит из поля Fore, десятичной точки, поля Aft и (если предоставлен параметр Exp, отличный от нуля) буквы E и поля Exp. Два возможных формата соответствуют:
Fore . Aft
и:
Fore . Aft E Exp
без пробелов между этими полями. Поле Fore может содержать ведущие пробелы и знак минус для отрицательных значений. Поле Aft содержит только десятичные цифры (возможно, с последующими нулями). Поле Exp содержит знак (плюс или минус) и показатель степени (возможно, с ведущими нулями).
Для типов с плавающей запятой значения по умолчанию для этих полей определяются следующими переменными, которые объявлены в обобщённом пакете Float_IO:
Default_Fore : Field := 2;
Default_Aft : Field := Num'Digits-1;
Default_Exp : Field := 3;
Для обычных или десятичных типов с фиксированной запятой значения по умолчанию для этих полей определяются следующими переменными, которые объявлены в обобщённых пакетах Fixed_IO и Decimal_IO соответственно:
Default_Fore : Field := Num'Fore;
Default_Aft : Field := Num'Aft;
Default_Exp : Field := 0;
Предоставляются следующие процедуры:
процедура Get(File : входной File_Type; Item : выходной Num; Width : входной Field := 0);
процедура Get(Item : выходной Num; Width : входной Field := 0);
Если значение параметра Width равно нулю, пропускаются любые ведущие пробелы, разделители строк или разделители страниц, затем считывается самая длинная возможная последовательность символов, соответствующая синтаксису любого из следующих (см. 2.4):
[+|–]числовой_литерал
[+|–]число.[показатель_степени]
[+|–].число[показатель_степени]
[+|–]основание#число_в_основании.#[показатель_степени]
[+|–]основание#.число_в_основании#[показатель_степени]
Если предоставлено ненулевое значение Width, то считываются ровно Width символов или символы (возможно, ни одного) до разделителя строки, что произойдёт первым; любые пропущенные ведущие пробелы включаются в счёт.
Возвращает в параметре Item значение типа Num, соответствующее считанной последовательности, сохраняя знак (положительный, если не указан) нулевого значения, если Num — тип с плавающей запятой и Num'Signed_Zeros имеет значение True.
Исключение Data_Error генерируется, если вводимая последовательность не соответствует требуемому синтаксису или если полученное значение не соответствует подтипу Num.
процедура Put(File : входной File_Type;
Item : входной Num;
Fore : входной Field := Default_Fore;
Aft : входной Field := Default_Aft;
Exp : входной Field := Default_Exp);

процедура Put(Item : входной Num;
Fore : входной Field := Default_Fore;
Aft : входной Field := Default_Aft;
Exp : входной Field := Default_Exp);
Выводит значение параметра Item как десятичный литерал с форматом, определённым Fore, Aft и Exp. Если значение отрицательное или если Num — тип с плавающей запятой, где Num'Signed_Zeros имеет значение True, и значение — отрицательно знаковая ноль, то знак минус включается в целую часть. Если Exp имеет значение ноль, то целая часть, подлежащая выводу, имеет столько цифр, сколько требуется для представления целой части значения Item, переопределяя Fore при необходимости, или состоит из цифры ноль, если значение Item не имеет целой части.
Если Exp имеет значение больше нуля, то целая часть, подлежащая выводу, имеет одну цифру, отличную от нуля, за исключением значения 0.0 Item.
Однако в обоих случаях, если целая часть, подлежащая выводу, имеет меньше Fore символов, включая любой знак минус, то ведущие пробелы сначала выводятся для восполнения разницы. Количество цифр дробной части задаётся Aft или равно одному, если Aft равно нулю. Значение округляется; значение, точно равное одной половине в последнем разряде, округляется от нуля.
Если Exp имеет значение ноль, то нет части показателя степени. Если Exp имеет значение больше нуля, то часть показателя степени, подлежащая выводу, имеет столько цифр, сколько требуется для представления показателя степени значения Item (для которого используется целая часть с одной цифрой), и включает начальный знак (плюс или минус). Если часть показателя степени, подлежащая выводу, имеет меньше Exp символов, включая знак, то ведущие нули предшествуют цифрам, чтобы восполнить разницу. Для значения 0.0 Item показатель степени имеет значение ноль.
процедура Get(From : входной String; Item : выходной Num; Last : выходной Positive);
Считывает вещественное значение из начала данного строки, следуя тому же правилу, что и процедура Get, которая считывает вещественное значение из файла, но рассматривает конец строки как разделитель файла. Возвращает в параметре Item значение типа Num, соответствующее вводимой последовательности. Возвращает в Last значение индекса, такое, что From(Last) — последний прочитанный символ.
Исключение Data_Error генерируется, если вводимая последовательность не соответствует требуемому синтаксису или если полученное значение не соответствует подтипу Num.
процедура Put(To : выходной String;
Item : входной Num;
Aft : входной Field := Default_Aft;
Exp : входной Field := Default_Exp);
Выводит значение параметра Item в заданную строку, следуя тому же правилу, что и при выводе в файл, используя значение Fore, такое, что последовательность выводимых символов точно заполняет строку, включая любые ведущие пробелы.
Float_Text_IO — это пакет библиотеки, который является необобщённым аналогом Text_IO.Float_IO для предопределённого типа Float:
с Ada.Text_IO;
пакет Ada.Float_Text_IO есть новый Ada.Text_IO.Float_IO(Float);
Для каждого предопределённого типа с плавающей запятой предоставляется необобщённый аналог Text_IO.Float_IO с такими именами, как Ada.Long_Float_Text_IO.

Разрешения реализации

Реализация может расширить Get и Put для типов с плавающей запятой, чтобы поддерживать такие специальные значения, как бесконечности и NaN.
Реализация Put может производить выходное значение с точностью не большей, чем та, которая поддерживается для базового подтипа. Дополнительная точность, если таковая имеется, значения, производимого Put, когда количество запрошенных цифр в целой и дробной частях превышает требуемую точность, определена реализацией.
Необобщённые эквивалентные пакеты могут быть фактическими инстанциациями обобщённого пакета для соответствующего предопределённого типа, хотя это не обязательно.
ПРИМЕЧАНИЕ 1 Для элемента с положительным значением, если вывод в строку точно заполняет строку без ведущих пробелов, то вывод соответствующего отрицательного значения будет распространять Layout_Error.
ПРИМЕЧАНИЕ 2 Правила для атрибута Value (см. 3.5) и правила для Get основаны на том же наборе форматов.

Примеры

Примеры использования инстанциации Text_IO.Float_IO:
пакет Real_IO есть новый Float_IO(Real); использовать Real_IO;
-- используемый по умолчанию формат при инстанцировании, Default_Exp = 3
X : Real := -123.4567; -- цифры 8 (см. 3.5.7)
Put(X); -- формат по умолчанию "–​1.2345670E+02"
Put(X, Fore => 5, Aft => 3, Exp => 2); -- "bbb–​1.235E+2"
Put(X, 5, 3, 0); -- "b–​123.457"


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API