在C语言中找到下一个IEEE 754表达式的数字(朝向-INF)?

5
我正在尝试编写一个函数,该函数接收一个32位浮点数(已从32位二进制字符串转换)并返回32位二进制中的前一个可表示的float值。到目前为止,我已经完成了从二进制到浮点数的转换,但是我在理解如何找到下一个可表示的IEEE 754值方面遇到了困难。你不能只减去可能的最小可表示值(000 0000 0000 0000 0000 0001)吗?此外,在查找最接近的可表示二进制值之前,从IEEE 754转换为Float是否有任何好处(如果有的话)?
到目前为止,我只有一个将浮点数转换为简单精度32位二进制的函数。我想把我的代码放上来,但这是为了学校,所以我对在线公开它或获得明确的纠正和建议感到不安。

  1. 发布你所拥有的。
  2. 提示:浮点数-->二进制,二进制++或--,二进制-->浮点数。
- chux - Reinstate Monica
将这个32位二进制位字符串转换为32位float是什么意思? - Keith Thompson
我的程序接收一个由int数组[32]表示的二进制数,然后将其转换为浮点数的符号、指数和尾数。 - user3614396
1个回答

6

问:你不能只减去可能的最小表示值吗?
答:不行。浮点数分布呈对数分布,而不是线性分布。减去任何固定值,如0.000001,对大的float没有影响,而对微小的float值有过度大的影响。

问:从IEEE 754转换为Float后寻找最接近的可表示二进制值有什么好处?
答:通常情况下,“IEEE 754”和“Float”是相同类型 - 不进行转换。两者都是32位数字表示。

以下取决于float是IEEE 754 binary32。它还需要int32_tfloat的字节顺序匹配。输入为-INF时,返回NaN

float nextdown(float x) {
  union {
    float x;
    int32_t i;
  } u;
  u.x = x;
  if (u.i > 0) {
    u.i--;
  }
  else if (u.i < 0) {
    u.i++;
  }
  else {
    u.i = 0x80000001;
  }
  return u.x;
}

上述方法无法很好地处理NaN。可以加入一个简单的额外测试:
float nextdown(float x) {
  // catch NaN
  if (x != x) return x;

  union {
    float x;
    int32_t i;
  } u;
  ...

注意:OP所需的功能与<math.h>中的nextafterf(x,-1.0f/0.0f)几乎完全相同,该函数用于测试此代码。NaN和-INF的差异。

我已经查看了math.h中的nextafterf()函数,但是无法理解它的内容以有效地将其应用到我的代码中。 - user3614396
2
@user3614396 nextafterf() 接受两个参数 xy。它返回方向为 y 的可表示的最靠近 x 的下一个 float 数字。因此,nextafterf(1.0f, 2.0f) 返回比 1.0f 稍微大一点的数字。nextafterf(1.0f, 0.0f) 返回比 1.0f 稍微小一点的数字。而 nextafterf(1.0f, 1.0f) 返回 1.0f - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接