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=[");

最低0.47元/天 解锁文章
880

被折叠的 条评论
为什么被折叠?



