2013-04-01 21 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