Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Ada类型转换,循环时退出_Loops_Type Conversion_Ada - Fatal编程技术网

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

Loops Ada类型转换,循环时退出,loops,type-conversion,ada,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

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;
提供错误

expected type "Standard.Float"
found type "Standard.Integer"
我一直在尝试对语句的所有部分执行
Float'Value()
,但是在键入(字符串)时,我发现了一些错误,我认为
exit是什么。现在我被困在这件事上,无法编译它。其他一切都很好,不需要审查

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

for (int i = 5; i < Math.sqrt(n) + 1; i +=6)
for(int i=5;i
Ada.Numerics.Generic_Elementary_函数中的平方根函数
(其中
Ada.Numerics.Elementary_函数
是一个实例)是

它只处理浮点类型

你可以使用

exit when i * i >= n;

(请注意,如果
i*i
等于
n
,那么
n
就不是素数;我认为需要注意这个终止条件)

Ada.Numerics.Generic_初等函数
中的平方根函数是

它只处理浮点类型

你可以使用

exit when i * i >= n;

(请注意,如果
i*i
等于
n
,那么
n
就不是首要条件;我认为需要注意这个终止条件)

Simon的答案效率要高很多,但为了证明你将如何按照你尝试的方式来做:

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

同样,如果您这样做,请在循环外部计算
Sqrt(Float(n))
,并将其保存在变量(或等效的东西)中。在循环中对同一个值反复调用
Sqrt
是没有意义的。(是的,我知道,有人会抱怨过早优化…)


更多:此示例演示如何实现类型转换
Float'Value
不会做这样的事情。如果您在中查找“Value attribute”,您将看到,
'Value
属性是一个函数,它接受一个
字符串
参数,并返回一个以字符串为图像的数字——也就是说,它解析字符串并返回一个数字,在这种情况下,
浮点

Simon的答案效率更高,但是,为了演示您将如何以您尝试的方式执行此操作:

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

同样,如果您这样做,请在循环外部计算
Sqrt(Float(n))
,并将其保存在变量(或等效的东西)中。在循环中对同一个值反复调用
Sqrt
是没有意义的。(是的,我知道,有人会抱怨过早优化…)


更多:此示例演示如何实现类型转换
Float'Value
不会做这样的事情。如果在中查找“Value attribute”,您将看到
'Value
属性是一个函数,它接受
字符串
参数,并返回一个图像为字符串的数字,即它解析字符串并返回一个数字,在本例中是一个
浮点值

,因此基本上您要说的是,没有其他选项可以使用
Sqrt
?这真的很奇怪。谢谢你们两位宝贵的回复。所以基本上你们的意思是,使用
Sqrt
,没有其他选项可以做到这一点?这真的很奇怪。谢谢你们两位宝贵的回答。这个算法发现5和7都是非素数。这个算法发现5和7都是非素数。至于在循环之前将计算值赋给变量-别担心,我本来打算这么做的(事实上我以前试过,但这是我尝试过的许多可能的事情之一)。这对我真的很有帮助。谢谢至于在循环之前将计算值赋给变量——别担心,我本来打算这么做的(事实上我以前试过,但这是我尝试过的许多可能的事情之一)。这对我真的很有帮助。谢谢