为什么没有 2 字节浮点数并且已经存在实现?

新手上路,请多包涵

假设我真的很需要内存并且想要更小的范围(类似于 short vs int )。着色器语言已经支持 half 用于具有一半精度的浮点类型(不仅仅是来回转换以使值在 -1 和 1 之间,即返回一个像这样的浮点数: shortComingIn / maxRangeOfShort )。 2字节浮点数是否已经存在实现?

我也有兴趣知道为什么没有 2 字节浮点数的任何(历史?)原因。

原文由 Samaursa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

回复:实现:显然有人为 C 编写了 half ,它(当然)可以在 C++ 中工作: https://storage.googleapis.com/google-code-archive-downloads/v2/code。 google.com/cellperformance-snippets/half.c

回复:为什么是 float 四个字节:可能是因为低于此, 它们的精度是如此有限。在 IEEE-754 中,“半”只有 11 位有效数字精度,产生大约 3.311 位十进制精度(而 单次 24 位产生 6 到 9 位十进制精度,或 53 位 精度产生15 和 17 位精度的十进制数字)。

原文由 T.J. Crowder 发布,翻译遵循 CC BY-SA 4.0 许可协议

各种编译器现在支持三种不同的半精度格式:

  • __fp16 主要用作存储格式。只要您对其进行计算,它就会被提升为浮动。对 __fp16 的计算将给出浮点结果。 __fp16 有 5 位指数和 10 位尾数。
  • _Float16 与 __fp16 相同,但用作交换和算术格式。对 _Float16 的计算将给出 _Float16 结果。
  • __bf16 是一种精度较低的存储格式。它有 8 位指数和 7 位尾数。

ARM 架构的编译器支持所有这三种类型,现在 x86 处理器的编译器也支持这三种类型。英特尔即将推出的 Golden Cove 处理器将支持 AVX512_FP16 指令集扩展,并且最新的 Clang、Gnu 和英特尔编译器都支持它。 _Float16 的向量在支持 AVX512_FP16 的编译器上定义为 m128h、m256h 和 __m512h。

参考:

https://developer.arm.com/documentation/100067/0612/Other-Compiler-specific-Features/Half-precision-floating-point-data-types

https://clang.llvm.org/docs/LanguageExtensions.html#half-precision-floating-point

原文由 A Fog 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题