25                           + 
"d not in [-90d, 90d]");
 
   32     prec = 
max(-1, 
min(
int(maxprec_), prec));
 
   33     if (prec == 1) ++prec;      
 
   36     GEOGRAPHICLIB_STATIC_ASSERT(numeric_limits<long long>::digits >= 45,
 
   37                                 "long long not wide enough to store 21600e9");
 
   38     const long long m = 60000000000LL;
 
   43     char georef1[maxlen_];
 
   44     georef1[0] = lontile_[ilon / tile_];
 
   45     georef1[1] = lattile_[ilat / tile_];
 
   47       georef1[2] = degrees_[ilon % tile_];
 
   48       georef1[3] = degrees_[ilat % tile_];
 
   50         x -= 
m * ilon; 
y -= 
m * ilat;
 
   51         long long d = (
long long)
pow(
real(base_), maxprec_ - prec);
 
   53         for (
int c = prec; 
c--;) {
 
   54           georef1[baselen_ + 
c       ] = digits_[
x % base_]; 
x /= base_;
 
   55           georef1[baselen_ + 
c + prec] = digits_[
y % base_]; 
y /= base_;
 
   59     georef.resize(baselen_ + 2 * prec);
 
   60     copy(georef1, georef1 + baselen_ + 2 * prec, georef.begin());
 
   64                         int& prec, 
bool centerp) {
 
   65     int len = 
int(georef.length());
 
   67         toupper(georef[0]) == 
'I' &&
 
   68         toupper(georef[1]) == 
'N' &&
 
   69         toupper(georef[2]) == 
'V') {
 
   73     if (
len < baselen_ - 2)
 
   74       throw GeographicErr(
"Georef must start with at least 2 letters " 
   76     int prec1 = (2 + 
len - baselen_) / 2 - 1;
 
   80       throw GeographicErr(
"Bad longitude tile letter in georef " + georef);
 
   81     real lon1 = 
k + lonorig_ / tile_;
 
   84       throw GeographicErr(
"Bad latitude tile letter in georef " + georef);
 
   85     real lat1 = 
k + latorig_ / tile_;
 
   91         throw GeographicErr(
"Bad longitude degree letter in georef " + georef);
 
   92       lon1 = lon1 * tile_ + 
k;
 
   94         throw GeographicErr(
"Missing latitude degree letter in georef " 
   98         throw GeographicErr(
"Bad latitude degree letter in georef " + georef);
 
   99       lat1 = lat1 * tile_ + 
k;
 
  101         if (georef.find_first_not_of(digits_, baselen_) != string::npos)
 
  102           throw GeographicErr(
"Non digits in trailing portion of georef " 
  103                               + georef.substr(baselen_));
 
  105           throw GeographicErr(
"Georef must end with an even number of digits " 
  106                               + georef.substr(baselen_));
 
  108           throw GeographicErr(
"Georef needs at least 4 digits for minutes " 
  109                               + georef.substr(baselen_));
 
  110         if (prec1 > maxprec_)
 
  112                               + 
" digits in georef " 
  113                               + georef.substr(baselen_));
 
  114         for (
int i = 0; 
i < prec1; ++
i) {
 
  115           int m = 
i ? base_ : 6;
 
  120           if (!(
i || (
x < 
m && 
y < 
m)))
 
  121             throw GeographicErr(
"Minutes terms in georef must be less than 60 " 
  122                                 + georef.substr(baselen_));
 
  129       unit *= 2; lat1 = 2 * lat1 + 1; lon1 = 2 * lon1 + 1;
 
  131     lat = (tile_ * lat1) / unit;
 
  132     lon = (tile_ * lon1) / unit;