使用C查找下一个IEEE 754可表示的数字(朝向-INF)?

时间:2014-10-19 17:50:18

标签: c floating-point ieee-754 floating-point-precision representation

我正在尝试编写一个函数,该函数接收32位浮点数(已从32位二进制字符串转换)并以32位二进制形式返回先前可表示的浮点数。到目前为止,我已经从二进制转换为浮点数,但是我很难理解如何找到下一个可表示的IEEE 754值。你不能只减去可能的最小可表示值(000 0000 0000 0000 0000 0001)吗?另外,在找到最接近的可表示二进制值之前,从IEEE 754转换为Float的好处是什么(如果有的话)?

到目前为止,我只有一个将浮点数转换为简单精度32位二进制的函数。我会包含我的代码,但这是针对学校的,所以我觉得如果把它放在网上/获得明确的更正和建议。

1 个答案:

答案 0 :(得分:4)

问:你不能简单地减去可能的最小可表示值吗? 答:不可以。浮点数以对数方式分布,而不是线性分布。减去任何固定值(如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的差异。

相关问题