Справочник Ada 95
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;
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, когда количество запрашиваемых цифр в целой и дробной частях превышает необходимую точность, определено реализацией.
Необобщённые пакеты могут, но не обязаны быть фактическими реализациями обобщённого пакета для соответствующего предопределённого типа.
ПРИМЕЧАНИЯ
30 Для элемента с положительным значением, если вывод в строку точно заполняет строку без ведущих пробелов, то вывод соответствующего отрицательного значения будет распространять Layout_Error.
31 Правила для атрибута 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"