【问题标题】:How to add and subtract 16 bit floating point half precision numbers?如何加减 16 位浮点半精度数?
【发布时间】:2011-10-02 00:07:44
【问题描述】:

如何加减 16 位浮点半精度数?

说我需要加减:

1 10000 0000000000

1 01111 1111100000

2 的补码形式。

【问题讨论】:

  • 请提供更多上下文。 C 没有半精度。
  • 16 位精度,但采用什么格式/标准?有符号位吗?螳螂有多少位,指数有多少?
  • 半精度算术通常没有硬件支持。 (所以没有简单的方法来做到这一点)英特尔编译器支持将半精度转换为单精度和从单精度转换的内在函数。
  • @Ernest Staszuk 看起来格式是符号(有偏?)指数尾数除了转换为浮点数或双精度数并返回之外,您可以编写所有按位逻辑来添加并减去数字。
  • 什么平台?一些平台,例如CUDA,支持 16 位半精度,但大多数不支持。

标签: bit-manipulation bit twos-complement


【解决方案1】:

OpenEXR 库定义了一个半精度浮点类。它是 C++,但在本地 IEEE754 浮点数和半数之间转换的代码应该很容易适应。请参阅:Half/half.h 作为开始。

【讨论】:

    【解决方案2】:

    假设您使用类似于 IEEE 单/双精度的非规范化表示,只需计算符号 = (-1)^S,如果 E != 0 则尾数为 1.M,如果 E = 则为 0.M = 0,并且指数 = E - 2^(n-1),对这些自然表示进行运算,并转换回 16 位格式。

    符号1 = -1 尾数1 = 1.0 指数1 = 1

    符号2 = -1 尾数2 = 1.11111 指数2 = 0

    总和: 符号 = -1 尾数 = 1.111111 指数 = 1

    表示:1 10000 1111110000

    当然,这假设了指数的过度编码。

    【讨论】:

    • 你的意思是:当然,这假设了指数的过度编码。
    • 我所做的一些实际数学运算只有在您了解指数过度编码时才有意义。如果您没有使用过度编码来表示指数 E,那么例如必须更改规则“E!= 0”......过度编码只是对指数进行编码的一种方式,因此负指数小于正指数无符号比较。维基百科可能对此有很好的讨论……否则,我会答应的。
    猜你喜欢
    • 1970-01-01
    • 2019-11-10
    • 2020-02-03
    • 1970-01-01
    • 2011-09-03
    • 2011-10-14
    • 2011-11-17
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多