|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 3131 (0xc3b)
Types: TextFile
Names: »B«
└─⟦5f3412b64⟧ Bits:30000745 8mm tape, Rational 1000, ENVIRONMENT 12_6_5 TOOLS
└─⟦91c658230⟧ »DATA«
└─⟦458657fb6⟧
└─⟦1472c4407⟧
└─⟦this⟧
└─⟦d10a02448⟧ Bits:30000409 8mm tape, Rational 1000, ENVIRONMENT, D_12_7_3
└─⟦fc9b38f02⟧ »DATA«
└─⟦9b46a407a⟧
└─⟦2e03b931c⟧
└─⟦this⟧
separate (Generic_Elementary_Functions)
procedure Kp_Exp (Y : in Common_Float;
M : out Common_Int;
Z1, Z2 : out Common_Float) is
-- On input, Y is a floating-point value in Common_Float;
-- On output, the values M, Z1, and Z2 are returned such that
-- exp(Y) = 2**M * (Z1 + Z2), where
-- exp(Y) is the natural exponential of Y.
-- Computations needed in order to obtain M, Z1, and Z2 involve three steps.
-- First, we reduce the argument Y to the form
-- Y = N * log2/32 + remainder,
-- where N has the value of an integer and |remainder| <= log2/64.
-- The value of N = Y * 32/log2 rounded to the nearest integer and
-- the remainder = Y - N*log2/32.
-- Second, we approximate exp(Y) - 1 by using KF_Em1Sm (Y1, Y2)
-- where Y1 is the leading part of the remainder and Y2 is the trailing part
-- of the remainder. The approximation is carried out by using a polynomial
-- and Working_Float. See the code in KF_Em1Sm for more details.
-- Third, we reconstruct the exponential of Y so that
-- exp(Y) = 2**M * (Z1 + Z2).
F, X, R1, R2, Q, Tmp : Common_Float;
Two_To_6 : constant := 64;
Two_To_8 : constant := 256;
Log2_By_32 : constant :=
16#5.8B90B_FBE8E_7BCD5_E4F1D_9CC01_F97B5_7A079_A1933_94C#E-2;
Thirty_Two_By_Log2 : constant :=
16#2E.2A8EC_A5705_FC2EE_FA1FF_B41A4_74FA2_3AD5E#;
I, N, N_1, N_2, J : Common_Int;
begin
X := Y;
-- Step 1. Reduce the argument.
-- To perform argument reduction, we find the integer N such that
-- X = N * log2/32 + remainder, |remainder| <= log2/64.
-- N is defined by round-to-nearest-integer( X*32/log2 ) and
-- remainder by X - N*log2/32. The calculation of N is
-- straightforward whereas the computation of X - N*log2/32
-- must be carried out carefully.
-- log2/32 is so represented in two pieces that
-- (1) log2/32 is known to extra precision, (2) the product
-- of N and the leading piece is a model number and is hence
-- calculated without error, and (3) the subtraction of the value
-- obtained in (2) from X is a model number and is hence again obtained
-- without error.
-- Perform argument reduction in Common_Float.
N := Common_Int (X * Thirty_Two_By_Log2);
if abs (N) >= Two_To_8 then
N_2 := N mod Two_To_6;
N_1 := N - N_2;
else
N_2 := 0;
N_1 := N;
end if;
Tmp := Common_Float (N_1) * Log2_By_32_Lead;
if abs (X) >= abs (Tmp) then
R1 := X - Tmp;
else
Tmp := 0.5 * Tmp;
R1 := (X - Tmp) - Tmp;
end if;
if N_2 /= 0 then
R1 := R1 - Common_Float (N_2) * Log2_By_32_Lead;
end if;
R2 := -Common_Float (N) * Log2_By_32_Trail;
J := N mod 32;
M := (N - J) / 32;
-- Step 2. Approximation.
Q := Kf_Em1sm (R1, R2);
-- Step 3. Function value reconstruction.
-- We now reconstruct the exponential of the input argument
-- so that Exp(Y) = 2**M * (Z1 + Z2).
-- The order of the computation below must be strictly observed.
F := Two_To_Jby32 (J, Lead) + Two_To_Jby32 (J, Trail);
Z1 := Two_To_Jby32 (J, Lead);
Z2 := Two_To_Jby32 (J, Trail) + F * Q;
return;
end Kp_Exp;