diff --git a/geolocation.install b/geolocation.install
index b8ef530..528be9e 100644
--- a/geolocation.install
+++ b/geolocation.install
@@ -27,18 +27,21 @@ function geolocation_field_schema($field) {
     'lat_sin' => array(
       'description' => 'Stores the sine of latitude',
       'type' => 'float',
+      'size' => 'big',
       'not null' => TRUE,
       'default' => 0,
     ),
     'lat_cos' => array(
       'description' => 'Stores the cosine of latitude',
       'type' => 'float',
+      'size' => 'big',
       'not null' => TRUE,
       'default' => 0,
     ),
     'lng_rad' => array(
       'description' => 'Stores the radian longitude',
       'type' => 'float',
+      'size' => 'big',
       'not null' => TRUE,
       'default' => 0,
     ),
@@ -52,3 +55,67 @@ function geolocation_field_schema($field) {
     'indexes' => $indexes,
   );
 }
+
+/**
+ * Convert auxiliary data columns to double and recalculate existing data.
+ */
+function geolocation_update_7101() {
+
+  $fields = geolocation_get_geolocation_fields();
+
+  foreach ($fields as $field) {
+
+    $table_prefixes = array(_field_sql_storage_tablename($field), _field_sql_storage_revision_tablename($field));
+    foreach ($table_prefixes as $table_prefix) {
+
+      $field_name = $field['field_name']; // eg 'field_mygeolocname' ;
+      $table = $table_prefix . $field_name;
+
+      // Convert three db columns from float to double precision
+      $columns = array($field_name . '_lat_sin', $field_name . '_lat_cos', $field_name . '_lng_rad');
+      $spec = array('type' => 'float', 'size' => 'big', 'not null' => TRUE, 'default' => 0.0);
+      foreach ($columns as $column) {
+        db_change_field($table, $column, $column, $spec);
+      }
+
+      // Now update these columns by re-calculating and re-storing existing values
+      $column_lat = $field_name . '_lat';
+      $column_lng = $field_name . '_lng';
+
+      $query = db_select($table, 'g')
+        ->fields('g', array('revision_id', 'delta', $column_lat, $column_lng));
+      $results = $query->execute();
+
+      foreach ($results as $row) {
+        $lat_rad = deg2rad($row->{$column_lat});
+        $lat_sin = sin($lat_rad);
+        $lat_cos = cos($lat_rad);
+        $lng_rad = deg2rad($row->{$column_lng});
+
+        // Cannot use drupal_write_record() within hook_update_N(), as the database
+        // schema cannot be relied on when a user is running a series of updates.
+        $updated = db_update($table)
+          ->fields(array(
+            $columns[0] => $lat_sin,
+            $columns[1] => $lat_cos,
+            $columns[2] => $lng_rad
+          ))
+          ->condition('revision_id', $row->revision_id)
+          ->condition('delta', $row->delta)
+          ->execute();
+      }
+    }
+  }
+  return t('Geolocation auxiliary data converted to double precision.');
+}
+
+function geolocation_get_geolocation_fields() {
+  $types = array_keys(geolocation_field_info()); // returns one value in our case
+  $fields = array();
+  foreach (field_info_fields() as $field) {
+    if (in_array($field['type'], $types)) {
+      $fields[] = $field;
+    }
+  }
+  return $fields;
+}
\ No newline at end of file
