【问题标题】:Convert integer to half-precision floating point format using round-to-even使用四舍五入将整数转换为半精度浮点格式
【发布时间】:2019-12-17 20:47:38
【问题描述】:

我已经知道如何使用截断实现半精度浮点数的转换(感谢this answer)。但是我怎样才能使用四舍五入来做同样的转换呢?例如,我希望 65519 舍入为 0x7bff(即 65504),而不是无穷大。再举一个例子:在链接解决方案中,8199 将由 8192 表示,但 8199 最接近的可表示为 8200

UPD: 更多示例:我想将 32768 和 65519 之间的整数舍入为 32 的倍数,将 16384 和 32768 之间的整数舍入为 16 的倍数,依此类推。在此解决方案中,8199 将由 8192 表示,但 8199 最接近的可表示为 8200

【问题讨论】:

  • 65519 是一个整数。轮到什么?您只是将最后 N 位设置为零吗?
  • @tadman 这是半精度浮点数,所以 OP 必须意味着 65519.0 无法表示。
  • 无法表示。例如,我想将 32768 和 65519 之间的整数舍入为 32 的倍数,将 16384 和 32768 之间的整数舍入为 16 的倍数等等。寻找在 c 上实现此功能的最佳方法
  • @FiddlingBits 当然,这更有意义。

标签: c floating-point rounding


【解决方案1】:

你需要两个部分来实现你想要的。

1.在进行转换之前添加舍入

  通过添加:

  // round the number if necessary before we do the conversion
  if (manbits > 13)
    absx += (2<<(manbits-13));

  manbits = 0;
  tmp = absx;
  while (tmp)
  {
    tmp >>= 1;
    manbits++;
  }

  在进行转换之前。

2。将剪辑改为无穷大到&gt; 16

  通过改变

  if (exp + truncated > 15)

  到:

  if (exp + truncated > 16)

我更新了原代码https://ideone.com/mWqgSP

【讨论】:

  • 但是这样其他值仍然会被截断,例如8199会用8192表示,但是8199最接近的表示是8200
  • 我的编辑应该可以解决您的问题。所以不再需要投票了:) 除非我错过了其他东西,请告诉我。
  • 它对某些测试用例不起作用(例如 65539 ​​应该用无穷大表示)。我想实现与 Wiki 页面 (en.wikipedia.org/wiki/Half-precision_floating-point_format) 上描述的完全相同的精度限制
  • 其实只是再读一遍你的标题,它提到了四舍五入。现在我明白你想要什么了。
  • 我再次更新了代码。我认为这一次应该四舍五入
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 2015-04-10
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多