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;

在 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;

当我试图编译我的代码时,出现了这个错误: 指数必须是自然类型,找到类型“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;

它应该按书面规定工作。最后,如果您已经创建了自己的浮点类型,您可以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 回答