Finding the angle between two bearings is often confusing.[1]



Task

Find the angle which is the result of the subtraction b2 - b1, where b1 and b2 are the bearings.


Input bearings are expressed in the range   -180   to   +180   degrees.

The  result  is also expressed in the range   -180   to   +180   degrees.



Compute the angle for the following pairs:

 20 degrees (b1) and 45 degrees (b2)
 -45 and 45
 -85 and 90
 -95 and 90
 -45 and 125
 -45 and 145
 29.4803 and -88.6381
 -78.3251 and -159.036


Optional extra
 
Allow the input bearings to be any (finite) value.



Test cases

 -70099.74233810938 and 29840.67437876723
 -165313.6666297357 and 33693.9894517456
 1174.8380510598456 and -154146.66490124757
 60175.77306795546 and 42213.07192354373


 
Program Bearings;
{ Reads pairs of angles from a file and subtracts them }
 
Const
  fileName = 'angles.txt';
 
Type
  degrees = real;
 
Var
  subtrahend, minuend: degrees;
  angleFile: text;
 
function Simplify(angle: degrees): degrees;
{ Returns an number in the range [-180.0, 180.0] }
  begin
    while angle > 180.0 do
      angle := angle - 360.0;
    while angle < -180.0 do
      angle := angle + 360.0;
    Simplify := angle
  end;
 
function Difference(b1, b2: degrees): degrees;
{ Subtracts b1 from b2 and returns a simplified result }
  begin
    Difference := Simplify(b2 - b1)
  end;
 
procedure Subtract(b1, b2: degrees);
{ Subtracts b1 from b2 and shows the whole equation onscreen }
  var
    b3: degrees;
  begin
    b3 := Difference(b1, b2);
    writeln(b2:20:11, '   - ', b1:20:11, '   = ', b3:20:11)
  end;
 
Begin
  assign(angleFile, fileName);
  reset(angleFile);
  while not eof(angleFile) do
    begin
      readln(angleFile, subtrahend, minuend);
      Subtract(subtrahend, minuend)
    end;
  close(angleFile)
End.
 