Ada sin(x)用泰勒级数计算

时间:2013-02-28 15:57:17

标签: ada sin

我是Ada的绝对初学者,我试图通过使用Taylor系列来计算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;

在Mat里面,这是我的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;

当我尝试编译我的代码时,会出现此错误: exponent必须是Natural类型,找到类型“Standard.Float”

我希望你能帮助我弄清楚我的类型出了什么问题!

2 个答案:

答案 0 :(得分:3)

第一个问题是:你是否需要将X提升为非整数幂?

在我看来,好像你没有:在哪种情况下用X**(2.0*I+1.0)替换X**(2*I+1),一切都会好的。

但是如果你真的这么做(也许不在这里,但在另一个应用程序中)你只需要让这样的操作符可见:包Ada.Numerics.Elementary_Functions中有一个Float,所以在你的函数之前有

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

它应该按照书面形式工作。 最后,如果您已经创建了自己的浮点类型,则可以使用类型作为参数来实例化通用包Ada.Numerics.Generic_Elementary_Functions,以专门为您的类型创建一组这些函数。

答案 1 :(得分:0)

喜欢Ada的强力打字。

在我的头顶,我怀疑你的问题可能是这一行:

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

2.0*I+1.0将返回Float。不是自然的。您可以尝试将其包装在Integer()Natural()中(自然是整数的子类型),看看是否有帮助。