4

私はAdaの初心者で、テイラー級数を使用してsin(x)[sin(3)now]を計算しようとしていますが、動作させることができません。

だからここに私の手順があります:

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;

コードをコンパイルしようとすると、次のエラーが発生します。 指数はNatural型である必要があり、「Standard.Float」型が見つかりました

私のタイプで何がうまくいかなかったのかを理解するのを手伝ってくれるといいのですが!

4

2 に答える 2

5

最初の質問は:Xを非整数の累乗にする必要がありますか?

私にはあなたがそうしないように見えます:その場合はに置き換えればX**(2.0*I+1.0)すべてX**(2*I+1)がうまくいくでしょう。

しかし、実際にそうする場合(おそらくここではありませんが、別のアプリケーションで)、そのような演算子を表示する必要があります:パッケージにFloat用の演算子があるAda.Numerics.Elementary_Functionsので、関数の前に

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

そしてそれは書かれたように動作するはずです。最後に、独自のfloat型を作成した場合は、型をパラメーターとして使用して汎用パッケージをインスタンス化Ada.Numerics.Generic_Elementary_Functionsし、型専用のこれらの関数のセットを作成できます。

于 2013-02-28T16:28:11.807 に答える
1

エイダの強いタイピングが大好きです。

頭のてっぺんから、あなたの問題は次の行にあるのではないかと思います。

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

2.0*I+1.0フロートを返します。自然ではありません。Integer()それをor Natural()(NaturalはIntegerのサブタイプ)でラップしてみて、それが役立つかどうかを確認できます。

于 2013-02-28T16:13:51.857 に答える