Ada循环on float类型的数量,直到它达到零

时间:2013-04-01 16:05:39

标签: 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

的无限循环

2 个答案:

答案 0 :(得分: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 P754浮点运算和符合标准的除法指令的系统上,除非您选择了特定的可选舍入模式,否则它最终会退出。但仍然没有使它成为一个好的编程方式!

如果你的目标完全如你所描述的那样,那么就更正式地重新说明:当四舍五入到一个小数位时,退出第一个代表0.0的数字。

这意味着,任何数字&lt; 0.05。

因此重新编写循环终止

exit when number < 0.05;

快乐。

否则,你真正想做的是什么?

答案 1 :(得分:0)

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

那就是说,我认为你可能没有等待足够长的时间:对我来说,它会在99行之后停止,

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

我想知道为什么你的比较是<=number怎么会变成消极的?