-- FILE: rel_fehler.adb with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions; with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Float_Text_IO; use Ada.Float_Text_IO; procedure Rel_Fehler is type Type_X_Null is array (1 .. 4) of Float; type Type_Result_Taylor is array (1 .. 20) of Float; type Type_Array_Result_Taylor is array (1 .. 4) of Type_Result_Taylor; X_Null : Type_X_Null := (-10.0, -1.0, 1.0, 10.0); Result_Exp : Float; Array_Result_Taylor : Type_Array_Result_Taylor; X_Wert : Float; -- FUNCTION Fehler function Fehler ( Exp : Float; Taylor : Float) return Float is begin return (abs (Exp - Taylor) / Exp); end Fehler; -- FUNCTION Fak function Fak ( N : Integer) return Long_Long_Integer is function Fak2 ( N : Long_Long_Integer) return Long_Long_Integer is begin if N = 1 then return 1; else -- Put (" " & Long_Long_Integer'Image (N * Fak2 (N - 1)) & " "); return N * Fak2 (N - 1); end if; end Fak2; begin case N is when 1 | 0 => return 1; when 2 => return 2; when 3 => return 6; when 4 => return 24; when 5 => return 120; when 6 => return 720; when 7 => return 5040; when 8 => return 40320; when 9 => return 362880; when 10 => return 3628800; when 11 => return 39916800; when 12 => return 479001600; when 13 => return 6227020800; when 14 => return 87178291200; when 15 => return 1307674368000; when 16 => return 20922789888000; when 17 => return 355687428096000; when 18 => return 6402373705728000; when 19 => return 121645100408832000; when 20 => return 2432902008176640000; when others => return Fak2 (Long_Long_Integer (N)); end case; end Fak; -- FUNCTION FakF -- -- Returns the Factorial as Float function FakF ( N : Integer) return Float is begin return Float (Fak (N)); end FakF; -- FUNCTION Taylor function Taylor ( Index_X_Null : Integer; Glieder : Integer) return Float is X_0 : Float := X_Null (Index_X_Null); type Type_Array_T is array (0 .. 20) of Float; T : Type_Array_T; begin T (0) := Exp (X_0); for i in 1 .. 20 loop T (i) := T (i - 1) + ( ( ( ( X_Wert/abs(X_Wert) )**I ) * (Exp(X_0)) / (FakF (I)) ) * (X_Wert - X_0) **i); end loop; return T (Glieder); end Taylor; begin Put_Line ("Geben Sie einen X_Wert ein: "); Get (X_Wert); Result_Exp := Exp (X_Wert); for I in 1 .. 4 loop for J in 1 .. 20 loop Array_Result_Taylor (I) (J) := (Taylor (I, J)); end loop; end loop; Put ("Ergebnis fuer die Berechnung mit e**x: "); Put (Result_Exp, 3,30,0); New_Line; Put_Line ("-------------------------------------------------------"); Put_Line ("Ergebnisse fuer die Berechnung mit Taylor: "); Put_Line ("-------------------------------------------------------"); for I in 1 .. 4 loop for J in 1 .. 20 loop Put ("Result_Taylor fuer X_NULL="); Put (X_Null (I), 3, 0, 0); Put (", n="); Put (J, 3); Put ("ist: "); Put (Array_Result_Taylor (I) (J), 3, 30, 0); New_Line; end loop; end loop; Put_Line ("-------------------------------------------------------"); Put ("Der relative Fehler ist: "); New_Line; for I in 1 .. 4 loop for J in 1 .. 20 loop Put ("Fehler fuer X_NULL="); Put (X_Null (I), 3, 0, 0); Put (", n="); Put (J, 3); Put ("ist: "); Put (Fehler (Result_Exp, Array_Result_Taylor (I) (J)), 3, 30, 0); New_Line; end loop; end loop; end Rel_Fehler;