Java 计算横向/纵向

Java 计算横向/纵向,java,floating-point,latitude-longitude,Java,Floating Point,Latitude Longitude,有谁能帮我找出从8字节值计算纬度和经度的算法吗 8字节值-A027AFDF5D984840其经度为49.1903648 8字节值-3AC7253383DD4B40其纬度为55.7305664 如果可能的话,请告诉我如何将浮点值0000000000 805A40计算为106.0这不是特定于经纬度计算的。假设您在示例中有8个字节要处理,那么您要做的是将字节数组转换为双精度浮点值。这三个示例的过程都是相同的 要查找浮点值,需要在位级别处理字节数组。这一过程的解释如下。或者退房 首先,在第一个示例中,您

有谁能帮我找出从8字节值计算纬度和经度的算法吗

8字节值-A027AFDF5D984840其经度为49.1903648
8字节值-3AC7253383DD4B40其纬度为55.7305664


如果可能的话,请告诉我如何将浮点值0000000000 805A40计算为106.0

这不是特定于经纬度计算的。假设您在示例中有8个字节要处理,那么您要做的是将字节数组转换为双精度浮点值。这三个示例的过程都是相同的

要查找浮点值,需要在位级别处理字节数组。这一过程的解释如下。或者退房

首先,在第一个示例中,您将按照40、48、98、5D等顺序处理字节。分解前两个字节40和48(0100 0000 0100 1000),就有足够的信息来获取符号位(0)和指数位范围(100 0000 0100->1028)。从这里开始,继续列出剩余的52位,以确定数字的小数部分。如果您按照上面链接中的计算进行操作,您将看到示例中预期的浮点值

作为旁注,一些编程语言为您提供了进行这种转换的方法。根据您使用的语言,这里不需要重新发明轮子

编辑:示例

要将字节数组转换为双精度浮点值,我们需要字节数组中的三条信息:符号位指数(E)分数(F)。首先要做的是创建8字节数组的64位表示形式。正如我上面提到的,您将以“反向”顺序使用字节(如果您想阅读该主题,请使用小尾端)。我将只使用前四个字节,因为它们足以说明这个过程

40 48 98 5D==>0100000001001000 10011000 01011101

我将按照0是最左边的顺序引用上面的位

符号位: 这是上面数组中的第0位。在这种情况下,S为0。符号位正是您所认为的,它决定浮点结果是负数还是正数

指数: 位1-11确定指数。在该示例中,指数E为100 0000 0100==>1028

分数: 剩余的位12-63确定分数。我仅举例说明第12-31位,以说明该过程的工作原理:1000 10011000 01011101

小数位数不转换为十进制值。相反,您需要遍历它们,注意设置的位(1,而不是0)。位的索引在这里很重要。考虑从1开始从左到右增加到20的分数位索引。同样,在完整示例(位12-63)中,该索引将是1到52

分数是通过对使用以下表达式设置的每个第i位求和得到的:2^-i。对于这个例子,这意味着我们正在处理索引1,5,8,9,14,16,17,18,20

前四个索引将为我们提供足够的精度,用于示例:

F=(2^-1)+(2^-5)+(2^-8)+(2^-9)+……=0.5+0.03125+0.00390625+0.001953125=0.537109375

最终值V通过应用以下公式得出:

V=-1^S*2^(E-1023)*(1+F)=-1^0+2^(1028-1023)*1.537109375=49.1875

这是您的目标值49.1903648的一个很好的近似值。如果您继续以我向您展示的方式使用完整的分数位范围,那么您的最终值将匹配


最后,既然您提到您正在使用Java,那么您有没有考虑过使用
ByteBuffer
类和
getDouble
函数

谢谢亚当的帮助。我正在用JAVA尝试这个。根据你的建议,我试图找出进行这种转换的方法,但我没有发现任何有用的东西。此外,由于我是新的较低级别的位操作,我没有得到在上面的链接中提供的转换方法。你能解释一下任意一个值的转换吗?谢谢,萨钦·德什穆克伍德。在以后的帖子中,您可能希望为您的问题分配更多标签,以帮助他们引起注意。