Ada - 类型转换,循环时退出

时间:2014-10-05 14:09:43

标签: loops type-conversion ada

Ada 2012。

我有这个定义:

with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
package body Primes is
   function is_prime(n : Integer) return Boolean
   is
      i : Integer := 5;
   begin
      if n <= 3 then
         return n > 1;
      elsif n mod 2 = 0 or else n mod 3 = 0 then
         return false;
      else
         --for i in 5 .. Sqrt()n + 1 
         loop
            if n mod i = 0 or else n mod (i + 2) = 0 then
               return false;
            end if;
            exit when i >= Sqrt(n) + 1;
            i := i + 6;
         end loop;
         return true;
      end if;

   end is_prime;

end Primes;

检查n是否为素数。这是行:

exit when i >= Sqrt(n) + 1;

提供错误

expected type "Standard.Float"
found type "Standard.Integer"

我一直在尝试Float'Value()语句的所有部分,但后来我得到了一些关于我认为exit when类型(字符串)的错误。现在我陷入了困境,无法进行编译。其他一切都很好,不需要审查。

我使用loop -> exit when -> end loop的原因是因为 Ada 不支持具有指定步骤的For循环,例如Java:

for (int i = 5; i < Math.sqrt(n) + 1; i +=6)

2 个答案:

答案 0 :(得分:3)

西蒙的答案效率更高,但为了证明你将如何按照你尝试的方式做到这一点:

        exit when Float(i) >= Sqrt(Float(n)) + 1.0;

Ada根本不会像某些语言那样自动将整数转换为浮点数。 (这也意味着它不会将整数文字1转换为Float,因为Float上的预定义+运算符需要Float您可以使用类型转换Float(1),而不是1.0。)

此外,如果您以这种方式执行操作,请在循环外部计算Sqrt(Float(n))并将其保存在变量(或等效的变量)中。在循环内的相同值上反复调用Sqrt是没有意义的。 (是的,我知道,有人会抱怨过早优化......)

更多信息:此示例显示了如何实现类型转换。 Float'Value并没有做那样的事情。如果你查找&#34;值属性&#34;在RM Index中,您将看到'Value属性是一个带有String参数的函数,并返回一个图像为字符串的数字 - 即。它解析字符串并返回一个数字,在本例中为Float

答案 1 :(得分:2)

Ada.Numerics.Generic_Elementary_Functions中的平方根函数(其中Ada.Numerics.Elementary_Functions是一个实例化)是

function Sqrt (X : Float_Type'Base) return Float_Type’Base;

只处理浮点类型。

您可以使用

exit when i * i >= n;

(请注意,如果i * i等于n,则n将不会成为素数;我认为需要注意此终止条件