我是 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;
Run Code Online (Sandbox Code Playgroud)
在 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;
Run Code Online (Sandbox Code Playgroud)
当我试图编译我的代码时,出现这个错误: 指数必须是自然类型,找到类型“Standard.Float”
我希望你能帮助我找出我的类型出了什么问题!
第一个问题是:您是否需要将 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;
Run Code Online (Sandbox Code Playgroud)
它应该像写的那样工作。最后,如果您创建了自己的 float 类型,则可以Ada.Numerics.Generic_Elementary_Functions
使用您的类型作为参数实例化泛型包,以专门为您的类型创建一组这些函数。