组合3个浮点数

本文关键字:浮点数 3个 组合 | 更新日期: 2023-09-27 18:26:30

我正在处理巨大的3D模型,我需要将它们写入一个文件以备将来使用。我的光盘空间有限,所以我需要想办法节省空间。

对于模型中的每个顶点,我希望以某种方式"组合"X、Y和Z值(浮动),然后能够在加载数据时对其进行解密。

浮点数最多只能有3位数的精度(即3.456)

起初,我有一个想法,如果3个值浮动,我可以得到平均值,然后有另一个值,我可以从中提取X和Y值,然后我可以从平均值中得到Z值。但在尝试了这个之后,我无法让它正常工作。

我的目标是能够以某种方式将3个浮点组合成一个整数,但我认为这是不可行的。

有人知道我该怎么做吗?

谢谢!)

组合3个浮点数

如果数字真的有3位数的精度(例如3.45),并且所有的值都在0到9.99之间,那么你可以很容易地将它们放入一个32位整数中:

int value =
  (int)Math.Round(x * 100.0) * 1000000 +
  (int)Math.Round(y * 100.0) * 1000 +
  (int)Math.Round(z * 100.0);

如果数字的精度为4位(例如3.456),那么您需要更多的位,即至少40位。如果值可以大于9.99,则需要另外六位来描述小数分隔符的位置。

否。鸽子洞原理。

或者以位为单位:10.xyz,不管二进制表示已经占用了至少13位;3*13是39,不能容纳32位。

使用像zlib这样的压缩库通常比巧妙地保存位更有效。(事实上,如果你后来决定使用zlib,那么聪明会伤害你。)

如果你知道你需要的精度,并且所有3个数字都在同一个刻度上,你可以存储一个指数和3个尾数。但在采用这种方法之前,我会先尝试zlib。

我要补充的是,无论是否zlib,将每个数字存储为与附近某个锚点的偏移量都会很有帮助。许多3D模型格式已经通过具有相对定位的对象的层次结构来做到这一点。这样,偏移量可以更小,因此对于相同的绝对精度需要更少的比特。

我不知道CLR处理它的效果如何,但在Ada中,您可以定义定点数字类型,并指定它应该占据的大小。

type MY_FIXED is delta 0.001  range -4.0..12.0; -- Or whatever your valid range.
For MY_FIXED'Size use SIZE_IN_BITS;

您可以在这里获得.NET Ada编译器:http://libre.adacore.com/libre/download2

(确保windows dotnet是你得到的。。。我还没有完成,但听说您可以将它集成到Visual Studio中。