2

我需要帮助解决这个简单的迭代问题。我正在尝试划分...

vhdl
number : Float := 55.0;

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

我希望它在第一个 0.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
4

2 回答 2

2

第一个打印的 0.0 不是零,它是一个相当大的浮点数,四舍五入到小数点后一位。

无论你除以多少次,如果你的算术是准确的,你永远不会以这种方式得到零,所以你会写一个无限循环。

现在,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 舍入到小数点后一位。

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

所以将循环终止重写为

exit when number < 0.05;

而且要快乐。

否则,你真正想要做什么?

于 2013-04-01T16:26:54.073 回答
0

您发布的代码无法编译;没有标准操作在左边&接受 a ,在右边接受 a ,然后返回 a 。StringFloatString

就是说,我想你可能没有等太久:对我来说,它在 99 行后停止,

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

我想知道为什么你的比较是<=?怎么可能number变成负数?

于 2013-04-01T16:28:07.387 回答