2013-02-28 57 views
3

我是Ada的絕對初學者,我試圖通過使用泰勒級數來計算sin(x)[sin(3)現在],但我只是'讓它工作。Ada sin(x)用泰勒級數計算

因此,這裏是我的方法:

with Ada.Float_Text_IO; 
with Mat; 
procedure SinKoz is 
    X:Float:=3.0; 
    Szamlalo:Float:=0.0; 
begin 
    for I in 1..100 loop 
     Szamlalo := Szamlalo + ((-1.0)**I)*(X**(2.0*I+1.0))/Mat.Faktorialis(2*I+1); 
    end loop; 
    Ada.Float_Text_IO.Put(Szamlalo); 
end SinKoz; 

而且裏面墊,這裏是我的Faktorialis,其計算2的階乘* I + 1:

function Faktorialis(N: Float) return Float is 
     Fakt : Float := 1.0; 
begin 
     for I in 1..N loop 
     Fakt := Fakt * I; 
     end loop; 
     return Fakt; 
end Faktorialis; 

當我試圖編譯我的代碼,這個錯誤出現: 指數的類型必須是自然,找到類型爲「Standard.Float」

我希望你可以幫助我弄清楚我的類型出了什麼問題!

回答

3

第一個問題是:您是否需要將X提升爲非整數倍?

它在我看來好像你沒有:在這種情況下,用X**(2*I+1)代替X**(2.0*I+1.0),一切都會好的。

但如果你真的這樣做(也許不在這裏,而在另一個應用程序),你只需要做出這樣的操作者可見:有在包Ada.Numerics.Elementary_Functions是一個浮動因此與

with Ada.Numerics.Elementary_Functions; 
use Ada.Numerics.Elementary_Functions; 

先於您的功能,它應該像書面一樣工作。最後,如果您創建了自己的浮點類型,則可以將類型作爲其參數創建一個通用包Ada.Numerics.Generic_Elementary_Functions,以創建一組專門用於您的類型的函數。

+0

+1:duh。這個答案比我的要好:)我已經離開了Ada一段時間了。 – 2013-02-28 16:29:14

+0

謝謝,這是一個非常詳細的答案! – Krav 2013-02-28 16:30:40

+0

有時候,通過多種方式來完成這項工作是件好事。 Ada是一個非常好的工具箱,不僅僅是一把錘子:-) – 2013-02-28 16:31:19

0

得愛阿達的強打字。

關閉我的頭頂,我懷疑你的問題可能是這一行:

Szamlalo := Szamlalo + ((-1.0)**I)*(X**(2.0*I+1.0))/Mat.Faktorialis(2*I+1); 

2.0*I+1.0是否會返回一個浮點數。不自然。你可以嘗試在Integer()Natural()(Natural是Integer的子類型)中打包,看看是否有幫助。

+0

這是問題,謝謝!是的,這對我的口味非常有用。 – Krav 2013-02-28 16:23:59