rur*_*kyi 6 c java floating-point
我知道标题听起来有点奇怪,但将消息压缩成16个字节非常重要.但是,整个数据是17.我能想到的唯一可能的解决方案是尝试将一个字节的坐标保存为7个字节而不是8个字节.
坐标的要求是存储5位小数的值作为最小值,例如0.00001.
假设我们有3.5个字节(28位).一位将用于符号,另一位用于标度,2用于指数,21位用于小数点,即2097152的唯一值,足以存储6个小数位.
我的问题是如何在C/Java中将4字节浮点数转换为3.5字节浮点数?您能否参考我现有的"微调"浮点数解决方案,我可以定义浮点数的所有组成部分?谢谢.
在这种情况下,我的第一选择不是一个奇怪的3.5字节"浮动",而是将其打包成一个整数.假设您的纬度范围是-90到90,经度从-180到180,它看起来像这样(Cish代码,未经测试):
float latitude = 45.12345
float longitude = 110.12345
unsigned int packedLatitude = (latitude + 90) * 100000 //25 bits
unsigned int packedLongitude = (longitude + 180) * 100000 //26 bits
float unpackedLatitude = packedLatitude / 100000.0f - 90.0f
float unpackedLongitude = packedLongitude / 100000.0f - 180.0f
Run Code Online (Sandbox Code Playgroud)
这为您提供6.4字节的坐标.剩下的就是将这6.4个字节打包到你的16-18字节结构中,我假设你已经知道该怎么做(这取决于你将它包装到哪里以及在哪里).
请注意,您需要注意这种方法的一些问题.下限(-90和-180)是硬限制,如果超出限制,则解压缩的坐标将不正确.你的上限有一点给定:纬度可以达到245,经度可以达到491,但你可能应该确保它们被标准化为-90-90/-180-180.如果它很重要你还应该知道你如何舍入或截断0.00001以下的额外数字(我相信这种方法会截断它们).
Float在这里毫无意义.你几乎肯定希望在北极,赤道和南极具有相同的精度(就弧度而言).因此,所有零都应表示北极0度,而28位1表示南极.
因此零度表示数字为零,180度表示(2**28) - 1或268435455.乘以纬度(从北极"双"度)乘以268435455/180或1491308.0833333333,转换为整数,取低位28位.(高6位应为零.)
要转换回来,将int中的28位隔离,强制转换为double,并除以上述因子.
经度可以类似地处理,只有360度而不是180度.