打印

需要计算两个GPS坐标之间的距离,但是单片机keil又不支持double,各大老是如何解决的。

[复制链接]
2251|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oufuqiang|  楼主 | 2024-12-27 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
需要计算两个GPS坐标之间的距离,但是单片机keil又不支持double,各大老是如何解决的。
GPS的报文本来就很长,而且是ascii的,转成数值都还不算难,但是精度不够。
$MYGPSPOS: $GPRMC,112744.000,A,2422.54920,N,10931.34392,E,0.00,0.86,041224,,,A,V*17

2422.54920,N

10931.34392,E


有没有大佬透露一下如何解决的。

使用特权

评论回复

相关帖子

沙发
William1994| | 2024-12-28 10:31 | 只看该作者
第一步, 定义一个数组,长度是10个字节。
第二步,对齐小数点
第三步,从低位到高位挨个进行减法,不足的借位。
实际计算速度比浮点数还快,浮点数还要归一化,移动小数点的位置,不停的移位。

使用特权

评论回复
板凳
William1994| | 2024-12-28 10:31 | 只看该作者
本帖最后由 William1994 于 2024-12-28 10:32 编辑

21ic点两次发送,就发重复了。能不能点了发送之后三秒内不让点第二次啊。

使用特权

评论回复
地板
oufuqiang|  楼主 | 2024-12-28 21:25 | 只看该作者
William1994 发表于 2024-12-28 10:31
第一步, 定义一个数组,长度是10个字节。
第二步,对齐小数点
第三步,从低位到高位挨个进行减法,不足的借 ...

这是模拟手搓竖式减法啊,我试试吧,没有其他办法也只能自己码了。

但是后面算距离的时候还是要平方开方的,这个就不好手搓了。

使用特权

评论回复
5
前功尽弃| | 2024-12-30 10:18 | 只看该作者
用IQ库试试

使用特权

评论回复
6
xzy568| | 2024-12-30 13:10 | 只看该作者
能否先当成整数来计算?算好后再把小数点移回来

使用特权

评论回复
7
Ketose| | 2024-12-30 14:29 | 只看该作者
什么单片机?51单片机吗?

使用特权

评论回复
8
William1994| | 2025-1-5 09:47 | 只看该作者
oufuqiang 发表于 2024-12-28 21:25
这是模拟手搓竖式减法啊,我试试吧,没有其他办法也只能自己码了。

但是后面算距离的时候还是要平方开方 ...

化简成  2.5 * 10^9 这个格式, 2.5 用float 存,9 用int来存。10开根号是固定的3.16。
sqrt(2.5E9) = sqrt(2.5)*sqrt(10)*sqrt(1E8) = sqrt(2.5)*3.16*1E4

使用特权

评论回复
评论
William1994 2025-1-5 09:49 回复TA
适合最后一步,有效位数要求不高的运算。 
9
oufuqiang|  楼主 | 2025-1-6 20:36 | 只看该作者
William1994 发表于 2025-1-5 09:47
化简成  2.5 * 10^9 这个格式, 2.5 用float 存,9 用int来存。10开根号是固定的3.16。
sqrt(2.5E9) = sq ...

果然是大佬,想法就是不一样,这种思路我怎么从来没想到过。

使用特权

评论回复
10
jackyhuang1988| | 2025-1-7 16:42 | 只看该作者
keil怎么会不支持double??

使用特权

评论回复
11
William1994| | 2025-1-10 08:56 | 只看该作者
jackyhuang1988 发表于 2025-1-7 16:42
keil怎么会不支持double??

Keil C51的double会编译成float。
以前电赛的时候老师都是让我们做三字节(2字节底数,一字节指数)的浮点库,做FFT的时候能快。
double的话要自定义类型,自己做函数库,现在java和c# 流行用bigint类,也就是一个大数组, 手搓加减乘除四则运算。很多时候运行库自带的64bit的double和80bit的extend都不够用的。
反倒是c++的半精度浮点数, 在嵌入式场合远比单精度和双精度有意义。我加热个温度,怎么可能需要万分之一的精度? 怎么可能需要正负一百万的范围?现在AI使用的单词之前的权重,半精度也非常合适。

我上面提的开根号的有效位数其实也不高,只能用在最后面的几个步骤的运算上。估计楼主也不是手搓double的汇编浮点库的人,二姨家的邓苗和老hot大叔等老一辈的8051汇编高手基本都退休了,剩我这种能手写汇编,偶尔把别人汇编转c语言(一天可以2KB的flash)的人也慢慢的很少了。回帖都只能捡最简单的办法来回复。

使用特权

评论回复
12
xzy568| | 2025-1-10 13:16 | 只看该作者
William1994 发表于 2025-1-10 08:56
Keil C51的double会编译成float。
以前电赛的时候老师都是让我们做三字节(2字节底数,一字节指数)的浮 ...

请教一下,如果用整数运算,最后结果再算出小数点的位置,会有什么问题?

使用特权

评论回复
13
zhxzhxzzhhxx| | 2025-1-10 14:37 | 只看该作者
其实 用 float 精度也是可以的,我试过大约能分辨5米的距离,长距离一点点误差更不用管了,再短的距离,GPS的稳定性又不够

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

1439

帖子

20

粉丝