我的 Metal 计算内核以 MTLPixelFormat.RG16Float 格式写入纹理,半精度浮点数。这是因为 Metal 不支持写入 32 位浮点纹理。
我需要在我的快速程序中读取这些半精度数字吗?我已将纹理移动到 Swift UInt8 数组中,但我无法弄清楚如何将半精度浮点数转换为 Swift 浮点数。
实际上@Muzza 的回答是不正确的。您可以从float16_t
指针中读取它们并将它们转换为普通的float32_t
. 无需使用外部库。只需导入arm_neon
标题。
编辑:以下答案是为 Swift v1 编写的。Swift 的更高版本通过 float16_t 类型添加了支持。在某些情况下,手动转换可能仍然有用。
没有内置方法可以将半数解释为浮点数,您必须自己进行转换。half 数据类型是遵循 IEEE 754 的浮点格式。您可以使用 UInt16 读取 swift 程序中的值,然后将其转换为浮点值。我不知道用 Swift 编写的任何转换例程,但这里有两个用 C++ 编写的库,可以很容易地转换:
http://mrob.com/pub/math/s10e5.h.txt
在第一个库中,需要转换的是函数 operator float(),它采用 UInt16 成员变量 _h 并输出一个浮点数。