Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将0表示为gnss坐标的负值_C - Fatal编程技术网

C 将0表示为gnss坐标的负值

C 将0表示为gnss坐标的负值,c,C,我有一个函数,它返回度和分钟作为gnss坐标的DDDMMMMM 为了提取度部分,我做了一个整数除法,作为dddmmmmm/10^7 但问题是,如果DDD为0,我就失去了符号。 如何保留DDD的符号,以便使用它的客户端可以知道其0的负数。 +0和-0用于定位北、南、东、西 -0001234567/10^7->-0度 客户端使用我的返回值,如: 如果ddd将其视为负度数。 然后,客户端使用此返回的度,并在显示器上以DDD或-DDD的形式打印 功能: int16 getDegree(int32 deg

我有一个函数,它返回度和分钟作为gnss坐标的DDDMMMMM

为了提取度部分,我做了一个整数除法,作为dddmmmmm/10^7

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

-0001234567/10^7->-0度

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

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

然后,客户端只需检查degreeObj.isNegative是否为真,简单地说就是:在C中不能可靠地使用负零整数,因为有符号整数表示可以是一补或二补。 由于twos补码没有负零,并且是主要的,并且可能是未来C标准的强制表示,所以在C中,整数根本不是您的选择


因此,我建议使用实用主义的浮点类型,比如double,对于您的情况,它通常应该具有足够的精度。

让我们假设为负值:

-DDDMMMMMMM
它可以重写为:

(-DDD) + (-MMMMMMM)
可通过以下公式计算:

(-DDDMMMMMMM / 10) + (-DDDMMMMMMM % 10)
其中%是C编程语言中模的运算符

因此如果

DDD = 0
你仍然有

-MMMMMMM
这仍然是负面的

总的来说,在我看来,你不需要太担心正零和负零。这个标志还在某处


正如已经指出的,为了得到您想要的,您应该保存符号,使用-dddmmmmm的绝对值进行除法,然后根据需要再次应用符号。

我看不到一种方法可以对整数执行您想要的操作。不能简单地将值的度数部分用作带符号的零整数

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

不过,有三种修复方法是可行的:

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

2使用-360,技术上等于-0度。但这可能会破坏您正在调用的代码。如果你沿着这条路走下去,你也可以用+360来表示一个正零,当值正好是0到最后一个小数点时,保持0


3将整个DDDMMMM转换为实数,可能是将MMM表示为十进制的双精度数。这样符号就很容易保存。

我只是想提取DDD部分并返回它。客户机只是绘制坐标。另一个模块给出的是-1801234567,返回-1800,-0和0有什么区别?-0是gnss位置的有效坐标,两者都有效。这有什么不同?长形和宽形的+0和-0应该给你完全相同的位置,不是吗?或者+0E与-0E在位置上是否不同?您的问题没有说明如何与客户端通信。是否向客户端发送包含数字和其他信息的字符串?您是以int和float对象还是以包含int和float对象表示的字节发送客户端号?用于与客户机通信的格式是否可以更改?是否可以在当前发送int的位置发送float或double?显示一些解释问题发生位置的代码。