class Geocoder::EastingNorthing

def to_osgb_36

def to_osgb_36
  osgb_fo  = 0.9996012717
  northing0 = -100_000.0
  easting0 = 400_000.0
  phi0 = deg_to_rad(49.0)
  lambda0 = deg_to_rad(-2.0)
  a = 6_377_563.396
  b = 6_356_256.909
  eSquared = ((a * a) - (b * b)) / (a * a)
  phi = 0.0
  lambda = 0.0
  n = (a - b) / (a + b)
  m = 0.0
  phiPrime = ((northing - northing0) / (a * osgb_fo)) + phi0
  while (northing - northing0 - m) >= 0.001
    m =
      (b * osgb_fo)\
        * (((1 + n + ((5.0 / 4.0) * n * n) + ((5.0 / 4.0) * n * n * n))\
          * (phiPrime - phi0))\
          - (((3 * n) + (3 * n * n) + ((21.0 / 8.0) * n * n * n))\
            * Math.sin(phiPrime - phi0)\
            * Math.cos(phiPrime + phi0))\
          + ((((15.0 / 8.0) * n * n) + ((15.0 / 8.0) * n * n * n))\
            * Math.sin(2.0 * (phiPrime - phi0))\
            * Math.cos(2.0 * (phiPrime + phi0)))\
          - (((35.0 / 24.0) * n * n * n)\
            * Math.sin(3.0 * (phiPrime - phi0))\
            * Math.cos(3.0 * (phiPrime + phi0))))
    phiPrime += (northing - northing0 - m) / (a * osgb_fo)
  end
  v = a * osgb_fo * ((1.0 - eSquared * sin_pow_2(phiPrime))**-0.5)
  rho =
    a\
      * osgb_fo\
      * (1.0 - eSquared)\
      * ((1.0 - eSquared * sin_pow_2(phiPrime))**-1.5)
  etaSquared = (v / rho) - 1.0
  vii = Math.tan(phiPrime) / (2 * rho * v)
  viii =
    (Math.tan(phiPrime) / (24.0 * rho * (v**3.0)))\
      * (5.0\
        + (3.0 * tan_pow_2(phiPrime))\
        + etaSquared\
        - (9.0 * tan_pow_2(phiPrime) * etaSquared))
  ix =
    (Math.tan(phiPrime) / (720.0 * rho * (v**5.0)))\
      * (61.0\
        + (90.0 * tan_pow_2(phiPrime))\
        + (45.0 * tan_pow_2(phiPrime) * tan_pow_2(phiPrime)))
  x = sec(phiPrime) / v
  xi =
    (sec(phiPrime) / (6.0 * v * v * v))\
      * ((v / rho) + (2 * tan_pow_2(phiPrime)))
  xiii =
    (sec(phiPrime) / (120.0 * (v**5.0)))\
      * (5.0\
        + (28.0 * tan_pow_2(phiPrime))\
        + (24.0 * tan_pow_2(phiPrime) * tan_pow_2(phiPrime)))
  xiia =
    (sec(phiPrime) / (5040.0 * (v**7.0)))\
      * (61.0\
        + (662.0 * tan_pow_2(phiPrime))\
        + (1320.0 * tan_pow_2(phiPrime) * tan_pow_2(phiPrime))\
        + (720.0\
          * tan_pow_2(phiPrime)\
          * tan_pow_2(phiPrime)\
          * tan_pow_2(phiPrime)))
  phi =
    phiPrime\
      - (vii * ((easting - easting0)**2.0))\
      + (viii * ((easting - easting0)**4.0))\
      - (ix * ((easting - easting0)**6.0))
  lambda =
    lambda0\
      + (x * (easting - easting0))\
      - (xi * ((easting - easting0)**3.0))\
      + (xiii * ((easting - easting0)**5.0))\
      - (xiia * ((easting - easting0)**7.0))
  [rad_to_deg(phi), rad_to_deg(lambda)]
end