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

1. 背景

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

2. 什么是经纬度

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

经纬度示意图

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

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

#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=[");
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值