Справочник Ada 2012
A.10.9 Ввод-вывод для вещественных типов
Статическая семантика
Следующие процедуры определены в обобщённых пакетах Float_IO, Fixed_IO и Decimal_IO, которые необходимо создать для соответствующих типов с плавающей запятой, обычных типов с фиксированной запятой или типов с десятичной фиксированной запятой соответственно (указано Num в спецификациях).
Значения выводятся в виде десятичных литералов без символов нижнего подчеркивания. Формат каждого выводимого значения состоит из поля Fore, десятичной точки, поля Aft и (если предоставлен параметр Exp, отличный от нуля) буквы E и поля Exp. Два возможных формата соответствуют:
Fore . Aft
и:
Fore . Aft E Exp
без пробелов между этими полями. Поле Fore может содержать ведущие пробелы и знак минус для отрицательных значений. Поле Aft содержит только десятичные цифры (возможно, с trailing zeros). Поле Exp содержит знак (плюс или минус) и показатель степени (возможно, с ведущими нулями).
Для типов с плавающей запятой значения по умолчанию для этих полей определяются следующими переменными, которые объявлены в обобщённом пакете Float_IO:
Default_Fore : Field := 2;
Default_Aft : Field := Num'Digits-1;
Default_Exp : Field := 3;
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;
Default_Aft : Field := Num'Aft;
Default_Exp : Field := 0;
Предоставляются следующие процедуры:
procedure Get(File : in File_Type; Item : out Num; Width : in Field := 0);
procedure Get(Item : out Num; Width : in Field := 0);
procedure Get(Item : out Num; Width : in Field := 0);
Если значение параметра Width равно нулю, пропускаются все ведущие пробелы, символы конца строки или страницы, затем считывается самая длинная возможная последовательность символов, соответствующая синтаксису любого из следующих (см. 2.4):
[+|–]числовой_литерал
[+|–]число.[экспонента]
[+|–].число[экспонента]
Если предоставлено ненулевое значение Width, то считывается ровно Width символов или символы (возможно, их нет) до символа конца строки, что произойдёт первым; любые пропущенные ведущие пробелы включаются в счёт.
В параметре Item возвращается значение типа Num, соответствующее введённой последовательности, сохраняя знак (положительный, если не указан) нулевого значения, если Num является типом с плавающей запятой и Num'Signed_Zeros равно True.
Исключение Data_Error передаётся, если введённая последовательность не имеет требуемого синтаксиса или полученное значение не является подтипом Num.
procedure Put(File : in File_Type;
Item : in Num;
Fore : in Field := Default_Fore;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
procedure Put(Item : in Num;
Fore : in Field := Default_Fore;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
Item : in Num;
Fore : in Field := Default_Fore;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
procedure Put(Item : in Num;
Fore : in Field := Default_Fore;
Aft : in Field := Default_Aft;
Exp : in 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 показатель степени имеет значение ноль.
procedure Get(From : in String; Item : out Num; Last : out Positive);
Считывает вещественное значение с начала заданной строки, следуя тому же правилу, что и процедура Get для считывания вещественного значения из файла, но рассматривает конец строки как терминатор файла. Возвращает в параметре Item значение типа Num, соответствующее введённой последовательности. Возвращает в Last значение индекса, такое, что From(Last) — последний прочитанный символ.
Исключение Data_Error передаётся, если введённая последовательность не имеет требуемого синтаксиса или полученное значение не является подтипом Num.
procedure Put(To : out String;
Item : in Num;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
Item : in Num;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
Выводит значение параметра Item в заданную строку, следуя тому же правилу, что и для вывода в файл, используя значение Fore, такое, что последовательность выводимых символов точно заполняет строку, включая любые ведущие пробелы.
Float_Text_IO — это пакет библиотеки, который является необобщённым эквивалентом Text_IO.Float_IO для предопределённого типа Float:
with Ada.Text_IO;
package Ada.Float_Text_IO is new Ada.Text_IO.Float_IO(Float);
package Ada.Float_Text_IO is new Ada.Text_IO.Float_IO(Float);
Для каждого предопределённого типа с плавающей запятой предоставляется необобщённый эквивалент Text_IO.Float_IO с такими именами, как Ada.Long_Float_Text_IO.
Разрешения реализации
Реализация может расширить Get и Put для типов с плавающей запятой, чтобы поддерживать такие специальные значения, как бесконечности и NaN.
Реализация Put не обязана создавать значение вывода с большей точностью, чем поддерживается для базового подтипа. Дополнительная точность, если таковая имеется, значения, созданного Put, когда количество запрошенных цифр в целой и дробной частях превышает требуемую точность, определяется реализацией.
Необобщённые эквивалентные пакеты могут, но не обязаны, быть фактическими созданиями обобщённого пакета для соответствующего предопределённого типа.
ПРИМЕЧАНИЯ
34 Для элемента с положительным значением, если вывод в строку точно заполняет строку без ведущих пробелов, то вывод соответствующего отрицательного значения распространит Layout_Error.
35 Правила для атрибута Value (см. 3.5) и правила для Get основаны на том же наборе форматов.
Примеры
Этот абзац был удалён.
package Real_IO is new Float_IO(Real); use Real_IO;
-- формат по умолчанию используется при создании, Default_Exp = 3
-- формат по умолчанию используется при создании, 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"
Put(X, Fore => 5, Aft => 3, Exp => 2); -- "bbb–1.235E+2"
Put(X, 5, 3, 0); -- "b–123.457"