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


FROM Terminal IMPORT *;
 
PROCEDURE WriteRealLn(value : REAL);
VAR str : ARRAY[0..16] OF CHAR;
BEGIN
    RealToStr(value, str);
    WriteString(str);
    WriteLn;
END WriteRealLn;
 
PROCEDURE AngleDifference(b1, b2 : REAL) : REAL;
VAR r : REAL;
BEGIN
    r := (b2 - b1);
    WHILE r < -180.0 DO
        r := r + 360.0;
    END;
    WHILE r >= 180.0 DO
        r := r - 360.0;
    END;
    RETURN r;
END AngleDifference;
 
BEGIN
    WriteString('Input in -180 to +180 range');
    WriteLn;
    WriteRealLn(AngleDifference(20.0, 45.0));
    WriteRealLn(AngleDifference(-45.0, 45.0));
    WriteRealLn(AngleDifference(-85.0, 90.0));
    WriteRealLn(AngleDifference(-95.0, 90.0));
    WriteRealLn(AngleDifference(-45.0, 125.0));
    WriteRealLn(AngleDifference(-45.0, 145.0));
    WriteRealLn(AngleDifference(29.4803, -88.6381));
    WriteRealLn(AngleDifference(-78.3251, -159.036));
 
    WriteString('Input in wider range');
    WriteLn;
    WriteRealLn(AngleDifference(-70099.74233810938, 29840.67437876723));
    WriteRealLn(AngleDifference(-165313.6666297357, 33693.9894517456));
    WriteRealLn(AngleDifference(1174.8380510598456, -154146.66490124757));
    WriteRealLn(AngleDifference(60175.77306795546, 42213.07192354373));
 
    ReadChar;
END Bearings.