我需要帮助解决这个简单的迭代问题。我想分开......
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 :(得分: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
怎么会变成消极的?