我想给二进制文件写一些弧度角。这样做有什么方法可以节省空间吗?
我考虑将它们转换为学位并将它们写成短片,但是当转换为短片时,它们会松散它们的小部分,这样就不会起作用了......
有什么想法吗?
编辑:我只需要2或3个小数点精度
答案 0 :(得分:1)
您需要多少精度/分辨率?
如果你可以使用半个圆的精度/分辨率,那么每个值1位就足够了:也就是说,你可以在一个字节中输入8个值。
...
答案 1 :(得分:0)
答案 2 :(得分:0)
压缩?
实现起来可能有点昂贵,但它可能比紧密压缩的二进制数据占用更少的空间。此外,未压缩的表单几乎可以是任何东西,例如人类可读的ASCII。
答案 3 :(得分:0)
Quake源代码中有一个方法将它们写成一个像这样的字节:
((int)radian*256/360) & 255 //radian is the angle
然后读出来就像这样:
b * (360.0f/256) //b is the byte read in
我测试了它,它留下了大约2位小数的精度,这对我来说应该没问题。
答案 4 :(得分:0)
您需要担心两件事:范围和精度。你还没有给我们足够的信息。
所以我会做出一些合理的(我希望)假设。
我假设所有的值都在0到2π(0到360°)的范围内。
如果将这些值存储为32位float
,则使用1位作为符号(对于始终为非负数的数字),对于指数使用8位(这将永远不会很大) )和有效数字的23位(可能比你需要的精度更高)。如果您使用的是64位double
,那么您显然会占用更多空间。
最明显的解决方案是使用小的无符号类型(因为您不需要负值),使用定点表示,以便值1
表示弧度的某个部分。对于0到2π(0到大约6.28)之间的值,在十进制二进制点之前需要3位。现在你只需要决定你想要多少比特分数。
如果使用8位无符号类型(通常为unsigned char
),则在二进制点之后为5位,因此值为1表示2 -5 弧度,约为1.82°。这勉强足以让你说你需要“2或3小数点精度”,但我怀疑它比你想要的更粗糙。
如果使用16位无符号类型(通常为unsigned short
),则在二进制点之后为13位,因此值为1表示2 -13 radian;这大约是0.007°,或大约25弧秒。这可能足够精确到您的目的,它通常是float
的存储空间的一半。
所有这些假设只是将值存储为32位float
s是不够的。磁盘空间(如果你担心的话)这些天很便宜,并且越来越便宜。
另请注意,如果要在不同系统之间共享数据,则将二进制值存储在文件中可能会出现问题。特别是字节排序可能是一个问题。如果您可以定义一个字节流格式(例如,表示16位无符号值的字节对,首先是最重要的字节 - 即“网络字节顺序”),您可以缓解该问题。整数值比浮点值更容易处理。