GNSS的经纬度使用float还是doubble数据类型存储传输?

news2024/11/17 4:38:52

1. 背景

        当你在使用导航、打车、定位等等场景下,一定会有形或者无形的使用位置服务,位置服务的基础功能功能就是向你提供位置信息,而经纬度是位置信息的主要信息,一般情况可以简单的认为位置信息就是经纬度信息。经纬度使用小数进行表示,小数在计算机内部以浮点表示,在IEEE754浮点原理 - 计算机存储小数的误差有多少-CSDN博客文章浏览阅读1k次,点赞11次,收藏21次。本质上计算机内部使用浮点就是二进制小数的科学计算法表示,与相同长度的整数(如都为32位长度)相比能表示更大的范围,但是浮点并不是全范围内等精度,它会随着要表示的数的绝对值变大而精度逐渐变小。https://blog.csdn.net/bitslink/article/details/139078980        已知,使用浮点可能存在误差,而且这个误差会随这个数增加而增大。那经纬度应该使用单精度浮点float还是双精度浮点doubble类型呢?首先应该清楚什么是经纬度?

2. 什么是经纬度

        经纬度是一套球面的坐标系统,纬度是指球面任意一点与球心连线与赤道面的夹角,范围在-90°~90°,赤道面以北成为北纬(一般使用正数表示),赤道面以南成为南纬(一般使用负数表示)。经度是指地球面上一点与两极的连线与0度经线所在平面的夹角,范围-180~+180(负东经,正西经)。经纬度如下图在球面上如下图所示:

经纬度示意图

3. 经纬度使用Float(单精度)的误差

        经纬度浮点数的最大范围在-180°~+180°,参考IEEE754浮点原理 - 计算机存储小数的误差有多少-CSDN博客对该范围内浮点小数进行分辨率分析,分析源码如下:

#include "stdio.h"
#include "stdint.h"

#define  NUM 19
int main()
{
    float ff[NUM];
    float yy[NUM];
    float dd[NUM];
    uint32_t *p;

    for(int i=0;i<NUM;i++)
    {
        if(0 == i)
        {
            ff[i] = 0.1;
            yy[i] = ff[0];
            p = (uint32_t *)&yy[i];
            *p += 1;
        }
        else
        {
            ff[i] = ff[i-1]+10;
            yy[i] = ff[i];
            p = (uint32_t *)&yy[i];
            *p += 1;
        }

        dd[i] = yy[i] - ff[i];

        printf("%0.2f\t %0.9f\n",ff[i],dd[i]);
    }

    printf("x=[");
    for(int i=0;i<NUM;i++)
    {
        printf("%0.2f,",ff[i]);
    }
    printf("]\n"); 
    printf("y=[");
    for(int i=0;i<NUM;i++)
    {
        printf("%0.9f,",dd[i]);
    }
    printf("]"); 
}

         浮点分析源码的运行结果如下:

0.10 0.000000007

5.10 0.000000477

10.10 0.000000954

15.10 0.000000954

20.10 0.000001907

25.10 0.000001907

30.10 0.000001907

35.10 0.000003815

40.10 0.000003815

45.10 0.000003815

50.10 0.000003815

55.10 0.000003815

60.10 0.000003815

65.10 0.000007629

70.10 0.000007629

75.10 0.000007629

80.10 0.000007629

85.10 0.000007629

90.10 0.000007629

95.10 0.000007629

100.10 0.000007629

105.10 0.000007629

110.10 0.000007629

115.10 0.000007629

120.10 0.000007629

125.10 0.000007629

130.10 0.000015259

135.10 0.000015259

140.10 0.000015259

145.10 0.000015259

150.10 0.000015259

155.10 0.000015259

160.10 0.000015259

165.10 0.000015259

170.10 0.000015259

175.10 0.000015259

180.10 0.000015259

185.10 0.000015259

        将运行结果,绘图后如下: 

浮点小数在0~180内使用float分辨率(纵轴分辨率、横轴浮点数)

        上图中浮点小数在130~180时分辨率最低,此时float分辨率仅为1.5259*10^{-5}(十万分子1.5),由分辨率引入的误差也为1.5259*10^{-5},弧长计算公式 l=\frac{\pi*r*\theta}{180}

角度与弧长

        根据弧长公式以及地球半径约为6371km,将上面曲线图纵轴转换成弧长的分辨率后,结果如下:

0.10 0.000828467

5.10 0.053021874

10.10 0.106043749

15.10 0.106043749

20.10 0.212087497

25.10 0.212087497

30.10 0.212087497

35.10 0.424174994

40.10 0.424174994

45.10 0.424174994

50.10 0.424174994

55.10 0.424174994

60.10 0.424174994

65.10 0.848349988

70.10 0.848349988

75.10 0.848349988

80.10 0.848349988

85.10 0.848349988

90.10 0.848349988

95.10 0.848349988

100.10 0.848349988

105.10 0.848349988

110.10 0.848349988

115.10 0.848349988

120.10 0.848349988

125.10 0.848349988

130.10 1.696699977

135.10 1.696699977

140.10 1.696699977

145.10 1.696699977

150.10 1.696699977

155.10 1.696699977

160.10 1.696699977

165.10 1.696699977

170.10 1.696699977

175.10 1.696699977

180.10 1.696699977

185.10 1.696699977

角度与弧长分辨率(纵轴为弧长单位米、横轴为角度)

        经纬度在180°内对应弧长最低分辨率约为1.7米,而由分辨率导致的误差等于分辨率,最大存储误差为1.7米。若使用float对经纬度进行存储传输,那么由于采用了float单精度浮点会存在一定误差,这个误差最大值小于1.5米。对于中国经纬度范围为73.33~135.05,3.51~53.33,采用单精度浮点flaot最大的存储误差为1.7米,最小的存储误差为0.85米。

4. 经纬度使用double(双精度)的误差

        与float类似首先对0~180内的浮点数进行进度分析,分析C语言源码如下:

#include "stdio.h"
#include "stdint.h"
#include "math.h"

#define  NUM 40
int main()
{
    double ffd[NUM];
    double yyd[NUM];
    double ddd[NUM];
    uint64_t *pd;

    for(int i=0;i<NUM;i++)
    {
        if(0 == i)
        {
            ffd[i] = 0.1;
            yyd[i] = ffd[0];
            pd = (uint64_t *)&yyd[i];
            *pd += 1;
        }
        else
        {
            ffd[i] = ffd[i-1]+5;
            yyd[i] = ffd[i];
            pd = (uint64_t *)&yyd[i];
            *pd += 1;
        }
        
        ddd[i] = (yyd[i] - ffd[i])*M_PI*6371000/180.0;

        printf("%0.2f\t %0.17lf\n",ffd[i],ddd[i]);
    }

    printf("x=[");
    for(int i=0;i<NUM;i++)
    {
        printf("%0.2lf,",ffd[i]);
    }
    printf("]\n"); 
    printf("y=[");
    for(int i=0;i<NUM;i++)
    {
        printf("%0.17lf,",ddd[i]);
    }
    printf("]"); 
}

运行结果如下:

0.10 0.00000000000154314

5.10 0.00000000009876093

10.10 0.00000000019752187

15.10 0.00000000019752187

20.10 0.00000000039504374

25.10 0.00000000039504374

30.10 0.00000000039504374

35.10 0.00000000079008747

40.10 0.00000000079008747

45.10 0.00000000079008747

50.10 0.00000000079008747

55.10 0.00000000079008747

60.10 0.00000000079008747

65.10 0.00000000158017495

70.10 0.00000000158017495

75.10 0.00000000158017495

80.10 0.00000000158017495

85.10 0.00000000158017495

90.10 0.00000000158017495

95.10 0.00000000158017495

100.10 0.00000000158017495

105.10 0.00000000158017495

110.10 0.00000000158017495

115.10 0.00000000158017495

120.10 0.00000000158017495

125.10 0.00000000158017495

130.10 0.00000000316034990

135.10 0.00000000316034990

140.10 0.00000000316034990

145.10 0.00000000316034990

150.10 0.00000000316034990

155.10 0.00000000316034990

160.10 0.00000000316034990

165.10 0.00000000316034990

170.10 0.00000000316034990

175.10 0.00000000316034990

180.10 0.00000000316034990

185.10 0.00000000316034990

将结果绘制曲线图,如下:

浮点在0~180内使用double分辨率(纵轴分辨率、横轴浮点数)

        根据弧长公式:l=\frac{​{\pi}r\theta}{180},其中r为地球半径约为6371米、θ为角度,然后将上图的纵轴转换成弧长,如下图所示: 

角度与弧长分辨率(纵轴为弧长单位米、横轴为角度)

        使用double类型后,分辨率为3.16*10-9米(3.16纳米),由分辨率导致的存储误差等于分辨率除2,最大误差约为1.58纳米。 

5. 总结

        对于经纬度使用单精度float存储传输,分辨率误差随所在地的经纬度增加而增加,当经纬度大于130°后存储误最大的存储误差约为1.7米。对于普通GNSS测量误差一般10米数量级,此时使用单精度float后对总的误差影响不大;但使用了双频GNSS或者RTK GSNSS后测量,前者测量误差在2~3米,否则测量误差约为10cm数量级,这时若仍然使用单精度float存储,此时可能存在存储误差要大于测量误差,此次可以使用双精度浮点进行存储,虽然这可能带来存储空间的翻倍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静态随机存储器(SRAM)

目录 介绍 基本的 SRAM 存储单元阵列 1. SRAM 存储单元 2. SRAM 阵列 3. SRAM 阵列的读写操作 4. SRAM 阵列的扩展 5. SRAM 阵列的应用 6. SRAM 阵列的优缺点 基本的 SRAM 逻辑结构 1. 存储单元 2. 存储单元阵列 3. 译码器 4. 读写电路 5. 控制逻辑 6. SRAM 逻辑…

多旋翼+发电机:国债应急系留照明无人机技术详解

多旋翼发电机技术的应急系留照明无人机是一种集成了先进飞行技术、发电技术和照明技术的无人机系统。这种无人机具有高度的灵活性、移动性和适应性&#xff0c;能够在各种复杂环境下迅速部署&#xff0c;为夜间搜救、救援等应急任务提供高效、可靠的照明支持。 无人机参数&…

微软改进WSL子系统 新版将支持镜像宿主机网络接口及使用外部DNS

Windows SubSystem for Linux (即 WSL) 是微软在 Windows 10/11 中开发的子系统功能&#xff0c;该功能允许用户在 Windows 上安装 Linux 系统和相关环境&#xff0c;对开发者来说可以构建 Linux 开发环境进行工作。不过 WSL 系统在功能上也有不少缺点&#xff0c;典型的就是默…

18.并发编程原子性、可见性、有序性原理

文章目录 原子性、可见性、有序性原理1.CPU物理缓存结构1.1.寄存器1.2.缓存1.3.物理内存 2.并发编程的三大问题2.1.原子性2.2.可见性2.3.有序性2.3.1.指令重排 2.4.总结 原子性、可见性、有序性原理 原子性&#xff0c;可见性&#xff0c;有序性&#xff0c;是并发编程中所面临…

四轮麦轮平衡车四个轮子安放位置要求,以及编码器测速注意事项(强调,否则无法正常平移)——基于STM32F103ZET6

轮子推荐ABBA&#xff0c;当然BAAB也可以 如图安放&#xff1a; 这两种安防位置可以实现平移效果 若要实现平移则需要先实现PID控制平衡&#xff0c;这里用到520编码电机&#xff0c;相较于370电机他的动力更足&#xff0c;在调节PID时能节约不少时间而且更加容易。 需要注意…

AI应用案例:AI就是这么牛,聊天就能分析股票。

今天给大家介绍一个可能跟你切身相关的案例“大模型股票分析“&#xff01;首先申明这不是教你怎么炒股的方法&#xff0c;而是告诉你可以通过AI协助你去分析股票。 像我是程序员出身&#xff0c;有数据给我&#xff0c;我可以写SQL语句查数据库&#xff0c;或者通过写代码来分…

QT上位机开发

目录 前言一、环境搭建1.1 IDE下载1.2 添加环境变量 二、Qt Creator的使用2.1 快捷键2.2 创建QT项目2.3 帮助文档使用 三、Qt信号与槽3.1 标准信号与槽的使用3.2 自定义信号与槽 四、Qt控件4.1 QMainWindow4.2 按钮4.3 容器4.4 窗口4.5 布局管理 五、SerialPort5.1 修改.Pro文件…

【Python】 Python函数返回多个值的多种方法

基本原理 在Python中&#xff0c;函数通常用于封装一段代码&#xff0c;使其可以重复调用。有时&#xff0c;我们希望一个函数能够返回多个值&#xff0c;Python提供了几种不同的方法来实现这一点。 代码示例 示例1&#xff1a;使用元组返回多个值 Python中&#xff0c;元组…

TYPE-C接口桌面显示器:办公与娱乐新玩法

随着科技的不断进步&#xff0c;传统桌面显示器已经难以满足现代人对高效办公与极致娱乐体验的追求。在这个背景下&#xff0c;新型的TYPE-C接口桌面显示器应运而生&#xff0c;以其独特的功能和设计&#xff0c;引领了未来办公与娱乐的新潮流。 添加图片注释&#xff0c;不超过…

Linux 批量网络远程PXE

一、搭建PXE远程安装服务器 1、yum -y install tftp-server xinetd #安装tftp服务 2、修改vim /etc/xinetd.d/tftpTFTP服务的配置文件 systemctl start tftp systemctl start xinetd 3、yum -y install dhcp #---安装服务 cp /usr/share/doc/dhc…

云上聚智共创未来 | 移动云的项目实战,10分钟让你获得高度可玩的个人博客网站

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 随着互联网的发展各种以前看起来离我们比较遥远的词越来越近了&#xff0c;比如 云服务、大数据、区块链、容器这些听起来…

免费且非常火的日程管理软件:飞项

一、简介 1、在日常繁忙的工签中&#xff0c;是否事情一大堆却记不住&#xff1f;系统自带的日历用着却是不方便&#xff0c;不顺手&#xff0c;提醒不及时&#xff1f;待办、打卡、记事乱七八糟的混在一起&#xff0c;关键时候找不到&#xff1f;市面上的日程管理软件那么多&a…

用go语言实现一个有界协程池

写在文章开头 本篇文章算是对go语言系列的一个收尾&#xff0c;通过go语言实现一个实现一个简单的有界协程池。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专家 &#xff0c;也是开源项目 Java Guide 的维护…

【C语言】自定义类型:联合与枚举的简明概述

&#x1f525;引言 关于自定义类型除了我们常用的结构体&#xff0c;还有联合与枚举也是属于自定义类型。本篇将简单介绍联合与枚举基本概念和使用方法 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&…

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力?

中国改革报是什么级别的报刊&#xff1f;在哪些领域具有较高的影响力&#xff1f; 《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸。它在经济领域和改革发展方面具有重要的影响力&#xff0c;是传递国家政策、反映改革动态的重要平台。该报对于推动中国的经济改…

【Java限流算法详解及实现】

Java限流算法详解及实现 在高并发场景下&#xff0c;限流是保护系统的重要手段。限流算法可以帮助我们在流量过大时进行合理的控制&#xff0c;避免系统崩溃。本文将详细介绍几种常见的限流算法及其在Java中的实现。 Java限流算法详解及实现 Java限流算法详解及实现一、令牌桶…

Android 深入系统源码探讨 Activity、Window 和 View 的关系与实践

文章目录 1、概括2、Android Window 设计2.1、Window 类2.2、PhoneWindow2.3、WindowManager2.4、ViewRootImpl2.5、DecorView 3、Android Activity 设计3.1、Activity的基本概念3.2.、Activity的生命周期3.3、Activity的内部结构 4、Android View 设计4.1、View的基本概念4.2、…

构建智慧城市公共服务系统的功能架构设计

随着城市化进程的加速&#xff0c;城市公共服务系统在保障居民生活品质、提升城市管理水平方面扮演着愈发重要的角色。构建智慧城市公共服务系统的功能架构设计至关重要&#xff0c;它不仅需要充分考虑居民需求与城市管理的实际情况&#xff0c;还需要整合先进的科技手段&#…

vue3快速入门(局部使用)

目录 前置知识JavaScript-导入导出 入门操作 变量渲染页面 局部使用vue的实现步骤 vue指令 v-for v-bind v-if v-show v-on v-model 生命周期 前置知识JavaScript-导入导出 正常情况在html导入js文件是全部导入&#xff0c;这样会导致性能上的损失 。 JS提供的…

Docker之xfs文件系统下安装报错解决方案

一、需求说明 centos系统下安装docker最新版的时候&#xff0c;安装成功&#xff0c;启动的时候报错。报错信息“failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorr…