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


/* Angle difference between bearings, in Jsish */
function angleDifference(bearing1:number, bearing2:number):number {
    var angle = (bearing2 - bearing1) % 360;
    if (angle < -180) angle += 360;
    if (angle >= 180) angle -= 360;
    return angle;
}
 
if (Interp.conf('unitTest')) {
    var dataSet = [[20, 45], [-45, 45], [-85, 90], [-95, 90], [-45, 125], [-45, 145],
                   [29.4803, -88.6381], [-78.3251, -159.036],
                   [-70099.74233810938, 29840.67437876723],
                   [-165313.6666297357, 33693.9894517456],
                   [1174.8380510598456, -154146.66490124757],
                   [60175.77306795546, 42213.07192354373]];
    printf("         Bearing 1          Bearing 2         Difference\n");
    for (var i = 0; i < dataSet.length; i++) {
        printf("%17S° %17S° %17S°\n", dataSet[i][0], dataSet[i][1],
               angleDifference(dataSet[i][0], dataSet[i][1])
        );
    }
}
 
/*
=!EXPECTSTART!=
         Bearing 1          Bearing 2         Difference
               20°                45°                25°
              -45°                45°                90°
              -85°                90°               175°
              -95°                90°              -175°
              -45°               125°               170°
              -45°               145°              -170°
          29.4803°          -88.6381°         -118.1184°
         -78.3251°          -159.036°          -80.7109°
-70099.7423381094°  29840.6743787672° -139.583283123386°
-165313.666629736°  33693.9894517456° -72.3439185186871°
 1174.83805105985° -154146.664901248° -161.502952307404°
 60175.7730679555°  42213.0719235437°  37.2988555882694°
=!EXPECTEND!=
*/