需要计算两个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
有没有大佬透露一下如何解决的。
第一步, 定义一个数组,长度是10个字节。
第二步,对齐小数点
第三步,从低位到高位挨个进行减法,不足的借位。
实际计算速度比浮点数还快,浮点数还要归一化,移动小数点的位置,不停的移位。
本帖最后由 William1994 于 2024-12-28 10:32 编辑
21ic点两次发送,就发重复了。能不能点了发送之后三秒内不让点第二次啊。 William1994 发表于 2024-12-28 10:31
第一步, 定义一个数组,长度是10个字节。
第二步,对齐小数点
第三步,从低位到高位挨个进行减法,不足的借 ...
这是模拟手搓竖式减法啊,我试试吧,没有其他办法也只能自己码了。
但是后面算距离的时候还是要平方开方的,这个就不好手搓了。 用IQ库试试 能否先当成整数来计算?算好后再把小数点移回来 什么单片机?51单片机吗? 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:47
化简成2.5 * 10^9 这个格式, 2.5 用float 存,9 用int来存。10开根号是固定的3.16。
sqrt(2.5E9) = sq ...
果然是大佬,想法就是不一样,这种思路我怎么从来没想到过。 keil怎么会不支持double?? 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)的人也慢慢的很少了。回帖都只能捡最简单的办法来回复。 William1994 发表于 2025-1-10 08:56
Keil C51的double会编译成float。
以前电赛的时候老师都是让我们做三字节(2字节底数,一字节指数)的浮 ...
请教一下,如果用整数运算,最后结果再算出小数点的位置,会有什么问题? 其实 用 float 精度也是可以的,我试过大约能分辨5米的距离,长距离一点点误差更不用管了,再短的距离,GPS的稳定性又不够
页:
[1]