Back to... GLOBE_3D

Source file : float_portable_binary_transfer.adb


package body Float_portable_binary_transfer is

  inverse_scaling: constant Num:= 1.0 / imposed_scaling;

  -- We rely on Ada's attributes of floating-point types, RM: A.5.3

  procedure Split (f: in Num; m: out Mantissa_type; e: out Exponent_type) is
  begin
    if imposed_mantissa then
      m:= Mantissa_type(imposed_scaling * Num'Fraction(f));
    else
      m:= Mantissa_type(Num'Scaling(Num'Fraction(f),Num'Machine_Mantissa));
    end if;
    e:= Num'Exponent(f);
  end Split;

  procedure Merge (m: in Mantissa_type; e: in Exponent_type; f: out Num) is
    fraction: Num;
  begin
    if imposed_mantissa then
      fraction:= Num(m) * inverse_scaling;
    else
      fraction:= Num'Scaling(Num(m),-Num'Machine_Mantissa);
    end if;
    -- We compose a float with the fraction and the exponent
    f:= Num'Compose(fraction, e);
  end Merge;

  -- Split / Merge in two parts --

  machine_half_mantissa: constant Integer:= 1+Num'Machine_Mantissa/2;

  procedure Split(f: in Num; m1,m2: out Mantissa_type; e: out Exponent_type) is
    f1,f2: Num;
  begin
    if imposed_mantissa then
      f1:= imposed_scaling * Num'Fraction(f);
    else
      f1:= Num'Scaling(Num'Fraction(f),machine_half_mantissa);
    end if;
    m1:= Mantissa_type(f1);
    f1:= f1 - Num(m1);
    if imposed_mantissa then
      f2:= imposed_scaling * f1;
    else
      f2:= Num'Scaling(f1,machine_half_mantissa);
    end if;
    m2:= Mantissa_type(f2);
    e:= Num'Exponent(f);
  end Split;

  procedure Merge(m1,m2: in Mantissa_type; e: in Exponent_type; f: out Num) is
    fraction: Num;
  begin
    if imposed_mantissa then
      fraction:= (Num(m1)+Num(m2) * inverse_scaling) * inverse_scaling;
    else
      fraction:= Num'Scaling(Num(m1)+Num'Scaling(Num(m2),-machine_half_mantissa),-machine_half_mantissa);
    end if;
    -- We compose a float with the fraction and the exponent
    f:= Num'Compose(fraction, e);
  end Merge;

end Float_portable_binary_transfer;

GLOBE_3D: Ada library for real-time 3D rendering. Ada programming.