铸造钻头数据To和From float
Casting bit data To and From float
我有一个问题,我想将非常特定的数据打包到特定的位中,并将它们存储在浮点中。我已经研究了简单地将数字打包成浮点值的方法,但使用简单的数学方法无法满足我的要求,因为我需要使用完整的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实现使用正确的四舍五入进行十进制到二进制以及二进制到十进制的转换。
因此,除非迫不得已,否则滥用这些片段是个坏主意。
相关文章:
- 如何解决"invalid conversion from 'char' to 'const char*'"
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 没有从阵列<float>到阵列<int>的可行转换
- 数组下标的类型"float*[float]"无效
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- std::async from std::async in windows xp
- 将 **float array 从 C++ Dll 传递给 python
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- float* 已在 Gameobject.obj 中定义
- 如何将 qml 的文本转换为 float 和 int
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- std::is_reference from std::any
- std::time_point from and to std::string
- 有没有比static_cast更优雅的从int到float的演员阵容<float>?
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- std::chrono::time_point from std::string
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- "Cannot convert parameter 1 from double to float"虽然没有更改参数
- 铸造钻头数据To和From float