/* Returns 0 on success, and -ve on error. */ static int valid_gps(struct gps_location *loc) { /* TODO: Important. * Can't do direct floating comparison as that causes a compiler error. * From Piazza, it was mentioned that we should return an error * only if the GPS coordinates are all zeros, so we just check for * that * https://piazza.com/class#fall2012/comsw4118/1065 */ const double zero_d = 0; const float zero_f = 0; unsigned long long int err_lat = double_to_long(zero_d); unsigned long long int err_lng = double_to_long(zero_d); unsigned int err_acc = float_to_int(zero_f); unsigned long long int loc_lat; unsigned long long int loc_lng; unsigned int loc_acc; if (loc == NULL) return -EINVAL; loc_lat = double_to_long(loc->latitude); loc_lng = double_to_long(loc->longitude); loc_acc = float_to_int(loc->accuracy); if (loc_lat == err_lat && loc_lng == err_lng && loc_acc == err_acc) return -EINVAL; else return 0; }
long __fixdfdi(double a) { double_t da; da.val = a; return double_to_long(da.data); }