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


import math
type Bearing = f64
 
const test_cases = [
    [Bearing(20), 45],
    [Bearing(-45), 45],
    [Bearing(-85), 90],
    [Bearing(-95), 90],
    [Bearing(-45), 125],
    [Bearing(-45), 145],
    [Bearing(29.4803), -88.6381],
    [Bearing(-78.3251), -159.036],
]
 
fn main() {
    for tc in test_cases {
        println(tc[1].sub(tc[0]))
        println(angle_difference(tc[1],tc[0]))
    }
}
 
fn (b2 Bearing) sub(b1 Bearing) Bearing {
    d := b2 - b1
    match true {
        d < -180 {
            return d + 360
        }
        d > 180 {
            return d - 360
        }
        else {
            return d
        }
    }
}
fn angle_difference(b2 Bearing, b1 Bearing) Bearing {
    return math.mod(math.mod(b2-b1, 360)+360+180, 360) - 180
}