c - 将 0 表示为 gnss 坐标的负数

标签 c

我有一个函数,可以将 gnss 坐标的度数和分钟返回为 DDDMMMMMMM。

为了提取度数部分,我进行了整数除法,如 DDDMMMMMMM/(10^7)。

但问题是,如果 DDD 为 0,我就会丢失符号。 如何保留 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;
}

客户端只需检查 DegreeObj.isNegative 是否为 true

最佳答案

我看不出有什么方法可以用整数做你想做的事情。您不能简单地将值的度数部分用作带符号的零整数。

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

不过,可以进行三个修复:

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

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

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

关于c - 将 0 表示为 gnss 坐标的负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899568/

相关文章:

c - 在循环中分配和释放内存(C + MPI)

c - 如何定义宏以将连接的 char 字符串转换为 C 中的 wchar_t 字符串

c - 保持 C 命令行应用程序在 Mac 应用程序包中运行

c - 在C编程中,有没有办法在子结构体(结构体中的结构体)中获取函数的返回值?

c - 嵌入式编程中的zalloc是什么?

c++ - 解决 sphinx 中此问题的想法

C scanf int 到 struct

c - 通过 C 中的几个函数传递结构?

从内核模块创建 sysfs 条目

c - 指向带索引的循环结构数组的指针