将0表示为gnss坐标的负数

时间:2019-07-05 08:40:46

标签: c

我有一个函数,用于返回gnss坐标的度和分钟作为DDDMMMMMMM。

要提取度数部分,我将整数除法为DDDMMMMMMM /(10 ^ 7)。

但是问题是,如果DDD为0,我会丢失符号。 如何保留DDD的符号,以便使用DDD的客户端可以知道其负数为0。
+0和-0用于定位北,南,东,西。

-0001234567 /(10 ^ 7)-> -0度

客户使用我返回的值,例如:

If(DDD <0)->将其视为负数。 然后,客户端使用此返回的度数,并在显示屏上以DDD或-DDD的形式进行绘制。

功能:

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;
}

客户端然后只需检查一下度Obj.isNegative是否为真

3 个答案:

答案 0 :(得分:1)

我看不到可以使用整数完成所需操作的方法。您不能简单地将值的度数部分用作带符号的零整数。

正如其他人所说,很难理解为什么你会关心。如果您不关心值09059 ...接近091,那么为什么要关心-00010 ...与+00010 ...是否不同?也许您真正需要做的是将值四舍五入到最接近的整数,然后000度代表-00030到+00030?

不过,可以修复三个问题:

1)使用浮点数表示整数度。浮点数确实具有负零的概念,但是您不能简单地与<0进行比较以检测到它;

2)使用-360,因为技术上等于-0度。但这可能会破坏您正在调用的代码。如果沿着这条路走,您还可以使用+360代表“正”零,并保持0(仅当该值正好为0至最后一个小数);

3)将整个DDDMMMMMM转换为将MMMMM表示为小数的实数(可能是双精度数)。这样,标志就很容易保存。

答案 1 :(得分:0)

简单地说:由于带符号的整数表示形式可能是1或2的补码,所以您不能在C中可靠地使用负零整数。 由于二进制补码没有负零并且是主要的,也可能是将来C标准的强制表示形式,因此整数不是您在C中的选择。

因此,我建议您务实使用浮点类型,例如let attachments = JSON.parse(pm.environment.get('attachments')); pm.test('All attachments are of correct value', function () { // ...write your test here using the `attachments` variable }); ,通常应适合您的情况。

答案 2 :(得分:0)

我们假设负值:

-DDDMMMMMMM

它可以被重写:

(-DDD) + (-MMMMMMM)

可以通过以下方式计算:

(-DDDMMMMMMM / 10) + (-DDDMMMMMMM % 10)

其中%是C语言中modulo的运算符。

因此,如果

DDD = 0

您仍然会有

-MMMMMMM

仍然为负。

总的来说,我认为您不必担心正零和负零。标志仍然在某处。


正如已经指出的那样,为了完全具有所需的符号,应保存符号,使用-DDDMMMMMMM的绝对值进行除法,然后根据需要再次应用符号。