oufuqiang 发表于 2024-12-27 09:59

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

需要计算两个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个字节。
第二步,对齐小数点
第三步,从低位到高位挨个进行减法,不足的借 ...

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

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

前功尽弃 发表于 2024-12-30 10:18

用IQ库试试

xzy568 发表于 2024-12-30 13:10

能否先当成整数来计算?算好后再把小数点移回来

Ketose 发表于 2024-12-30 14:29

什么单片机?51单片机吗?

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

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 ...

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

jackyhuang1988 发表于 2025-1-7 16:42

keil怎么会不支持double??

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)的人也慢慢的很少了。回帖都只能捡最简单的办法来回复。

xzy568 发表于 2025-1-10 13:16

William1994 发表于 2025-1-10 08:56
Keil C51的double会编译成float。
以前电赛的时候老师都是让我们做三字节(2字节底数,一字节指数)的浮 ...

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

zhxzhxzzhhxx 发表于 2025-1-10 14:37

其实 用 float 精度也是可以的,我试过大约能分辨5米的距离,长距离一点点误差更不用管了,再短的距离,GPS的稳定性又不够
页: [1]
查看完整版本: 需要计算两个GPS坐标之间的距离,但是单片机keil又不支持double,各大老是如何解决的。