你如何在阿达得到平方根?

时间:2014-11-05 23:48:57

标签: ada matrix-multiplication

所以我被赋予了一个读取文件的赋值,将数字放入两个矩阵中,乘以矩阵,最后将输出放入.txt文件中。

我之前从未使用过Ada,我认为这将是一个很好的挑战。我被困在试图确定两个独立数组的边界。

这就是我目前所拥有的:

currentSpread := I;
g := Ada.Numerics.Generic_Complex_Elementary_Functions.Sqrt(I);
while J < g loop

  if(I mod J = 0) THEN
     if(currentSpread > ((I/J - J)/2)) THEN
        currentSpread := ((I/J - J)/2);
        arrayBounds := J;
     end if;

  end if;

  J := J + 1;
end loop;

我遇到的问题是sqrt功能。我想找到矩阵乘法最佳边界的因子,这是我认为实现它的唯一方法。

我得到的错误是:

invalid prefix in selected component "Ada.Numerics.Generic_Complex_Elementary_Functions"

非常感谢您的帮助。

- 更新

要求的完整代码:

with Ada.Text_IO;use Ada.Text_IO;
with Ada.Integer_Text_IO;
with Ada.Numerics.Generic_Complex_Elementary_Functions;
with Ada.Numerics.Generic_Elementary_Functions;
with Ada.Numerics.Complex_Elementary_Functions;
with Ada.Numerics.Generic_Complex_Types;

procedure Main is

   dataFile : File_Type;
   resultFile : File_Type;
   value : Integer;
   I : Integer := 0;
   J : Integer;
   currentSpread : Integer;
   arrayBounds : Integer;
   g : Integer;

begin

  Ada.Text_IO.Open(File => dataFile, Mode => Ada.Text_IO.In_File, Name =>"C:\Users\Jeffrey\Desktop\data.txt");


   while not End_Of_File(dataFile) loop
      Ada.Integer_Text_IO.Get(File => dataFile, Item => value);
      Ada.Integer_Text_IO.Put(Item => value);
      Ada.Text_IO.New_Line;
      I := I + 1;
   end loop;

   Ada.Integer_Text_IO.Put(I);
   I := I/2;
   J := 1;
   currentSpread := I;
   g := Ada.Numerics.Generic_Complex_Elementary_Functions.Sqrt(I); 
   while J < g loop

      if(I mod J = 0) THEN
         if(currentSpread > ((I/J - J)/2)) THEN
            currentSpread := ((I/J - J)/2);
            arrayBounds := J;
         end if;

      end if;

        J := J + 1;

   end loop;

   declare
     type newArray is array(Integer range <>, Integer range<>) of Integer;
      X : Integer := J;
      Y : Integer := I/J;
      Arr1 : newArray(1..Y, 1..X);
      Arr2 : newArray(1..X, 1..Y);
      finAnswer : newArray(1..X, 1..X);
   begin

      for z in 1 .. X loop
         for k in 1 .. Y loop
            Ada.Integer_Text_IO.Get(File => dataFile, Item => value);
            Arr1(z, k) := value;
         end loop;
      end loop;

      for z in 1 .. Y loop
         for k in 1 .. X loop
            Ada.Integer_Text_IO.Get(File => dataFile, Item => value);
            Arr2(z, k) := value;
         end loop;
      end loop;

      for l in 1 .. X loop
         for m in 1 .. Y loop
            for n in 1 .. X loop
               finAnswer(l, n) := finAnswer(l, n) + Arr1(l, n)* Arr2(n, m);
            end loop;
         end loop;
      end loop;
   end;



   Ada.Text_IO.Close(File => dataFile);
end Main;

我只使用平方根来计算出数字的因素。我现在如何设置它将达到平方根然后它将采用最小的因子扩散。我不关心舍入错误或其他任何事情,如果它不是一个完美的方形,它可以绕任何一种方式。

感谢。

1 个答案:

答案 0 :(得分:5)

Generic_Complex_Elementary_Functions是一个通用包。它不能直接使用。这就是编译器在这一行上给你一个错误的原因:

Ada.Numerics.Generic_Complex_Elementary_Functions.Sqrt(I);

要使用它,您必须使用要使用的浮点类型实例化通用Generic_Complex_Types,然后使用Generic_Complex_Elementary_Functions实例实例化Generic_Complex_Types。幸运的是,如果您愿意使用内置类型Float,则不必完成所有这些操作;该语言为您提供Ada.Numerics.Complex_Elementary_Functions,使用Float作为浮点类型,或者Ada.Numerics.Long_Complex_Elementary_Functions使用Long_Float,如果您的编译器供应商支持它。

但是,我认为您不想使用Complex任何内容。这涉及复杂的数字,我怀疑你想要使用那些。使用Ada.Numerics.Elementary_Functions(或Long_Elementary_Functions)来处理实数。

最后,即使这不起作用:

Ada.Numerics.Elementary_Functions.Sqrt(I)

如果I是整数,因为参数类型必须是Float。您必须使用类型转换。

Ada.Numerics.Elementary_Functions.Sqrt(Float(I))