如何仅使用 Ada 中的图像功能来控制显示目的的小数位数?

How to control the number of decimals places for display purpose only using Image function in Ada?

我在 Ada 中有以下代码行,

     Put_Line ("Array of " & Integer'Image (iterations)
        & "          is " & Long_Float'Image (sum) 
        & " Time = " & Duration'Image(milliS) & timescale);  

sum的小数位数太长显示不出来(不适合计算,因为sum计算需要长浮点数)。我知道 Ada 在不使用 Image 函数的情况下使用 aft 和 fore 显示小数的替代方法,但在我切换到替代方法之前,我想知道 Image 是否有选项或其他显示小数的技术。图像函数是否有显示小数的选项?有没有缩短Long_Float的小数位数仅供显示的技巧?

with Ada.Numerics;
 with Ada.Text_IO; use Ada.Text_IO;

 procedure Images is
 sum                : Standard.Long_Float;
 Pi                 : Long_Float := Ada.Numerics.Pi;

  type Fixed is delta 0.001 range -1.0e6 .. 1.0e6;
  type NewFixed is range -(2 ** 31) .. +(2 ** 31 - 1);
  type Fixed2 is new Long_Float range -1.0e99.. 1.0e99;
  type Fixed3 is new Long_Float range -(2.0e99) .. +(2.0e99);


 begin
 sum:=4.99999950000e14;
 Put_Line ("no fixing number: " & Pi'Image);
 Put_Line (" fixed number: " & Fixed'Image(Fixed (Pi)));
 Put_Line ("no fixing number: " & Long_Float'Image(sum));
 Put_Line (" testing fix: " & Fixed3'Image(Fixed3 (sum)));
 end Images;

附录:

  1. 请注意,我的变量总和定义为 Standard.Long_Float 以与整个程序中使用的其他变量一致。
  2. 我正在添加代码以显示我的问题的罪魁祸首以及我为解决该问题所做的尝试。它基于 Simon Wright 提供的示例以及我添加的总和数。看起来我只需要弄清楚如何将 delta 插入 Fixed3 类型,因为 delta 定义了小数位数。

Long_Float'图像(总和)只是一个形式为“snnnnn.ddddd”的常规字符串。注意字符's'代表符号,字符'n'代表数字,字符'd'代表小数。

因此,如果要删除最后三位小数,只需使用以下内容

Long_Float'图像(总和)(Long_Float'图像(总和)'第一个.. Long_Float'图像(总和)'最后- 3);

’Image 没有任何选项,参见 ARM2012 3.5(35) (also (55.4))。

但是,Ada 202x ARM K.2(88) and 4.10(13) 建议另一种选择:

with Ada.Numerics;
with Ada.Text_IO; use Ada.Text_IO;
procedure Images is
   Pi : Long_Float := Ada.Numerics.Pi;
   type Fixed is delta 0.001 range -1.0e6 .. 1.0e6;
begin
   Put_Line (Pi'Image);
   Put_Line (Fixed (Pi)'Image);
end Images;

哪些报告(GNAT CE 2020、FSF GCC 10.1.0)

$ ./images 
 3.14159265358979E+00
 3.142

Image 属性对所有类型具有相同的参数,因此无法指定格式。有generic nested packages in Ada.Text_IO for handling I/O of numeric types. For your case you can instantiate Ada.Text_IO.Float_IO for Float or just use the built-in Ada.Float_Text_IO instance. You can then use the Put procedure to specify the format. There is an example in the Ada Standard:

    package Real_IO is new Float_IO(Real); use Real_IO;
    -- default format used at instantiation, Default_Exp = 3
    
    X : Real := -123.4567;  --  digits 8      (see 3.5.7)
    
    Put(X);  -- default format                            "–​1.2345670E+02"
    Put(X, Fore => 5, Aft => 3, Exp => 2);                -- "bbb–​1.235E+2"
    Put(X, 5, 3, 0);                                      -- "b–​123.457"

正如其他人指出的那样,“图像属性函数不提供对格式的任何控制。但是,当然可以编写一个函数来实现。有关通用示例,请参阅 PragmARC.Images.Float_Image