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