铸造钻头数据To和From float

Casting bit data To and From float

本文关键字:From float To 数据      更新时间:2023-10-16

我有一个问题,我想将非常特定的数据打包到特定的位中,并将它们存储在浮点中。我已经研究了简单地将数字打包成浮点值的方法,但使用简单的数学方法无法满足我的要求,因为我需要使用完整的32位来存储非常特定的值。如果它是一个32位的整数,这将非常容易。

所以我想做的是将数据编码为32位整数,然后将此位数据直接转换为浮点值,所有位保持不变(除非有人对如何做到这一点有更好的建议)。什么语言可以让我进行这样的转换?显然,不是javascript和python,因为它们不支持32位浮点。C#或C++会这么做吗?

我需要解码GLSL或HLSL顶点着色器中的数据。着色器当然会接收32位浮点值。有没有一个运算符可以让我直接将浮点转换为具有所有相同位的整数,而不是普通的强制转换?或者用其他方式直接读取比特?


UPDATE:Eric Postpischil在下面的回答中展示了如何轻松地在C中进行直接转换。现在我只需要知道是否有一种方法可以在顶点着色器中直接从float转换为int或bit数据。有人能帮上忙吗?

您可以在C中使用来完成此操作

#include <stdint.h>
float IntegerToFloat(uint32_t u)
{
return (union { uint32_t u; float f; }) {u} .f;
}
uint32_t FloatToInteger(float f)
{
return (union { float f; uint32_t u; }) {f} .u;
}

当然,这需要float在C实现中是32位,并且uint32_t是受支持的类型(但如果不是,则可以使用另一个32位整数类型,很可能是unsigned int)。产生的一些float值可能是NaN,在某些操作中可能不会保持不变,例如用于打印或显示的转换以及转换回。即使是正常的float值通常也不会保持不变,除非它们以足够的精度显示,并且C实现使用正确的四舍五入进行十进制到二进制以及二进制到十进制的转换。

因此,除非迫不得已,否则滥用这些片段是个坏主意。