от
У меня есть функция, которая возвращает Градусы и минуты, как DDDMMMMMMM для координат ГНСС. Для извлечения градусов, я сделал целочисленное деление как DDDMMMMMMM / (10^7). Но проблема в том , что ДДД-это 0, я потерял знак. Как я могу сохранить знак ДДД, так что клиент, использующий его, может знать его 0 с отрицательным. 0 и -0 используется для установки на Север, Юг,Восток , Запад. -0001234567 / (10^7) -> -0 градусов Клиент использует мой возвращаемое значение, как: Если(ДДД воспринимаю это как отрицательную степень. Затем клиент использует этот возвращенный степени и заговоры на дисплее или ДДД-ДДД . Функции:
int16 getDegree(int32 degreeMinutes)
{
   int16 degree = (int16)(degreeMinutes/10000000); //DDDMMMMMMM/10^7 = DDD 
   return degree;
}
Другие, чем с помощью другой переменной, чтобы проверить, если число является отрицательным, как показано ниже, я не вижу другого способа, что это может быть сделано:
struct degree
{
  int16 degree;
  bool isNegative;
}degreeObj;

struct degree getDegree(int32 degreeMinutes)
{
   degreeObj.isNegative = false;
   degreeObj.degree = (int16)(degreeMinutes/10000000); //DDDMMMMMMM/10^7 
   if(degreeMinutes < 0) //DDDMMMMMMM as a whole is less than 0
   degreeObj.isNegative = true;

   return degreeObj;
}
Клиент, в дополнение к проверке-это ДДД

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

3 Ответы

0 голосов
от
Я не вижу пути, что вы можете делать то, что вы хотите с целыми числами. Вы не можете просто использовать градусов часть значение подписанного ноль целых. Как уже говорили другие, это трудно понять, почему вы бы все равно. Если вы не волнует, что стоимость 09059... ближе к 091, тогда почему тебя волнует, что -00010... отличается от 00010... ? Возможно, что вам действительно нужно сделать, это округлить значение до ближайшего целого градуса, затем 000 градусов представляет -00030 до 00030? Хотя три исправления возможны: 1) использовать поплавок, чтобы представить целое число градусов. Поплавок есть понятие отрицательный нуль, но вы не можете просто сравнить на
0 голосов
от
Проще говоря: вы не можете надежно использовать отрицательный нуль целые числа в C, поскольку подписаны представлении целого числа может быть либо из них дополняют или twos дополняют. С двойки дополнит имеет отрицательный нуль, и является доминирующим, а также могут быть обязательным представлением для будущих стандартов C, числа просто не ваш выбор в C. Так что я рекомендую быть прагматичным и просто с плавающей запятой, как
double
, который, как правило, должны иметь достаточную точность для вашего случая.
0 голосов
от
Предположим, что отрицательное значение:


Это может быть переписано:

(

который может быть вычислен с:

(

где % является оператором для modulo
в языке программирования C . Поэтому если
DDD = 0
у вас все еще будет


который остается негативным.

В целом, вам не нужно беспокоиться столько о положительных и отрицательных нулей нули, на мой взгляд. Знак по-прежнему существует где-то.



Как уже отмечалось, для того, чтобы иметь именно то, что вы хотите, вы должны сохранить знак, деление, используя абсолютное значение -DDDMMMMMMM, а потом снова примените знак, по мере необходимости.
...