2013-04-01 24 views
1

我需要帮助这个简单的迭代问题。我想分...Ada循环类型的数量直到它达到零

number : Float := 55.0; 

loop 
    number := number/3.0; 
    Put (number); 
    exit when number <= 0.0; 
end loop; 

我希望它在第一个0.0退出。

我不断收到的18.3 6.1 2.0 0.7 0.2 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

+0

告诉你什么:拿出一张纸,从55中分出3。然后将结果除以3.继续重复这个过程,当结果<= 0时回到我们。 :-) –

+0

确实生病了,因为你说我曾经想分55/3:P。在ada中漂浮是有点奇怪,并提供简单的计算奇怪的结果,正如我下面所说,我写这显示我有问题。它显示额外的零 – ma1169

+0

不,没有什么不寻常的事情。您的编译器使用IEEE标准浮点,就像您可能需要运行的其他编译器/解释器一样。如果你不相信我(或者,正如我所说,手工尝试),请尝试使用另一种语言的相同循环逻辑。 –

回答

2

第一印刷0.0无限循环不为零,这是在浮法术语一些相当大的数字,四舍五入至小数点后一位。

不管你用3除以多少次,如果你的算法是准确的,你将永远不会实际得到零这样,所以你会写一个无限循环。

现在,Ada中的算术并不是那么准确,但对于这个特定的例子,它显然是以这样的方式进行四舍五入以得到相同的效果。或者,正如西蒙所说,你没有等太久。这不可靠;机会是Long_Float

type Big_Float is digits 18; 
package Big_Float_IO is new Float_IO(Num => Big_Float); 
use Big_Float_IO; 

number : Big_Float := 55.0; 

可能会给出不同的结果。

编辑:任何采用符合IEEE标准的除法指令的IEEE P754浮点运算的系统,它最终都会退出,除非您选择了特定的可选舍入模式。但是,这仍然不能成为编程的好方法!

如果您的目标与您所描述的完全相同,则可以更正式地重新陈述它:在第一个数字表示0.0时退出,四舍五入至小数点后一位。

这意味着,任何数字< 0.05。

所以重新写循环终止为

exit when number < 0.05; 

和快乐。

否则,你真的在​​做什么?

+0

ty。我试图做别的事情,但在数字<0.05时退出;目前工作关于定义新的浮动的唯一问题是,当我使用put或得到它说它期望类型standard.float发现类型big_float – ma1169

+0

解决这个“问题”,你需要实例化通用I/O库你的新float类型,为Big_Float创建一个自定义的“put”...我将编辑答案 –

+0

更合适的答案可能是'当数字<0.0001时退出;'或者某个常量适合您的问题:我到达0.05从你在问题中的明确描述。 –

0

您发布的代码不会编译;没有标准操作&,其左侧为String,右侧为Float,并返回String

这么说,我想你可能没有等了很久:对我来说,这后99行停止,

... 
number= 8.40779E-45 
number= 2.80260E-45 
number= 1.40130E-45 
number= 0.00000E+00 

我不知道为什么你比较<=number怎么可能变成负值?

+0

这不是我正在处理的代码。我正在处理其他事情,但是我编写了这段代码来解释问题 – ma1169

+0

它可能不是您正在处理的代码,但它是您询问的代码! –

+0

<=因为它的用户变量在代码中,所以对于这种混淆,它不会总是0 – ma1169