120 lines
2.8 KiB
Ada
120 lines
2.8 KiB
Ada
with Ada.Text_IO;
|
|
|
|
package body Approximation is
|
|
|
|
package RIO is new Ada.Text_IO.Float_IO(Real);
|
|
|
|
-- create an approximation
|
|
|
|
function Approx(Value: Real; Sigma: Real) return Number is
|
|
begin
|
|
return (Value, Sigma);
|
|
end Approx;
|
|
|
|
-- unary operations and conversion Real to Number
|
|
|
|
function "+"(X: Real) return Number is
|
|
begin
|
|
return Approx(X, 0.0);
|
|
end "+";
|
|
|
|
function "-"(X: Real) return Number is
|
|
begin
|
|
return Approx(-X, 0.0);
|
|
end "-";
|
|
|
|
function "+"(X: Number) return Number is
|
|
begin
|
|
return X;
|
|
end "+";
|
|
|
|
function "-"(X: Number) return Number is
|
|
begin
|
|
return Approx(-X.Value, X.Sigma);
|
|
end "-";
|
|
|
|
-- addition / subtraction
|
|
|
|
function "+"(X: Number; Y: Number) return Number is
|
|
Z: Number;
|
|
begin
|
|
Z.Value := X.Value + Y.Value;
|
|
Z.Sigma := Sqrt(X.Sigma*X.Sigma + Y.Sigma*Y.Sigma);
|
|
return Z;
|
|
end "+";
|
|
|
|
function "-"(X: Number; Y: Number) return Number is
|
|
begin
|
|
return X + (-Y);
|
|
end "-";
|
|
|
|
-- multiplication / division
|
|
|
|
function "*"(X: Number; Y: Number) return Number is
|
|
Z: Number;
|
|
begin
|
|
Z.Value := X.Value * Y.Value;
|
|
Z.Sigma := Z.Value * Sqrt((X.Sigma/X.Value)**2 + (Y.Sigma/Y.Value)**2);
|
|
return Z;
|
|
end "*";
|
|
|
|
function "/"(X: Number; Y: Number) return Number is
|
|
Z: Number;
|
|
begin
|
|
Z.Value := X.Value / Y.Value;
|
|
Z.Sigma := Z.Value * Sqrt((X.Sigma/X.Value)**2 + (Y.Sigma/Y.Value)**2);
|
|
return Z;
|
|
end "/";
|
|
|
|
-- exponentiation
|
|
|
|
function "**"(X: Number; Y: Positive) return Number is
|
|
Z: Number;
|
|
begin
|
|
Z.Value := X.Value ** Y ;
|
|
Z.Sigma := Z.Value * Real(Y) * (X.Sigma/X.Value);
|
|
if Z.Sigma < 0.0 then
|
|
Z.Sigma := - Z.Sigma;
|
|
end if;
|
|
return Z;
|
|
end "**";
|
|
|
|
function "**"(X: Number; Y: Real) return Number is
|
|
Z: Number;
|
|
begin
|
|
Z.Value := X.Value ** Y ;
|
|
Z.Sigma := Z.Value * Y * (X.Sigma/X.Value);
|
|
if Z.Sigma < 0.0 then
|
|
Z.Sigma := - Z.Sigma;
|
|
end if;
|
|
return Z;
|
|
end "**";
|
|
|
|
-- Output to Standard IO (wrapper for Ada.Text_IO.Float_IO)
|
|
|
|
procedure Put_Line(Message: String;
|
|
Item: Number;
|
|
Value_Fore: Natural := 7;
|
|
Sigma_Fore: Natural := 4;
|
|
Aft: Natural := 2;
|
|
Exp: Natural := 0) is
|
|
begin
|
|
Ada.Text_IO.Put(Message);
|
|
Put(Item, Value_Fore, Sigma_Fore, Aft, Exp);
|
|
Ada.Text_IO.New_Line;
|
|
end Put_Line;
|
|
|
|
procedure Put(Item: Number;
|
|
Value_Fore: Natural := 7;
|
|
Sigma_Fore: Natural := 3;
|
|
Aft: Natural := 2;
|
|
Exp: Natural := 0) is
|
|
begin
|
|
RIO.Put(Item.Value, Value_Fore, Aft, Exp);
|
|
Ada.Text_IO.Put(" (+-");
|
|
RIO.Put(Item.Sigma, Sigma_Fore, Aft, Exp);
|
|
Ada.Text_IO.Put(")");
|
|
end Put;
|
|
|
|
end Approximation;
|