将浮点(弧度角)写入文件时节省空间

时间:2012-07-29 18:14:16

标签: c binary angle

我想给二进制文件写一些弧度角。这样做有什么方法可以节省空间吗?

我考虑将它们转换为学位并将它们写成短片,但是当转换为短片时,它们会松散它们的小部分,这样就不会起作用了......

有什么想法吗?

编辑:我只需要2或3个小数点精度

5 个答案:

答案 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位无符号值的字节对,首先是最重要的字节 - 即“网络字节顺序”),您可以缓解该问题。整数值比浮点值更容易处理。