C 帮助-IEEE-754-提取、规范化、NAN等

C 帮助-IEEE-754-提取、规范化、NAN等,c,floating-point,C,Floating Point,~请原谅我- 我之前有一篇文章叫IEEE-754-查找符号位、指数、分形、归一化等 但是,我没有注册我的nic,我无法编辑它。(所以这个帖子对我来说基本上是死的)有人能删除它吗?我的问题也没有答案。 所以我用不同的代码发布这个 我仍然需要很多帮助。。。所以请不要把这篇文章当作复制品 我找到了符号位、指数位和尾数 我要测试什么才能找到标准化的?如果exp==0 对于无穷大,我应该测试什么?exp==0xff和mantiasa==0? 这个标志和它有关吗 我要测试什么才能找到零?exp==0

~请原谅我-

  • 我之前有一篇文章叫IEEE-754-查找符号位、指数、分形、归一化等
但是,我没有注册我的nic,我无法编辑它。(所以这个帖子对我来说基本上是死的)有人能删除它吗?我的问题也没有答案。 所以我用不同的代码发布这个

  • 我仍然需要很多帮助。。。所以请不要把这篇文章当作复制品
我找到了符号位、指数位和尾数

我要测试什么才能找到标准化的?如果exp==0

对于无穷大,我应该测试什么?exp==0xff和mantiasa==0? 这个标志和它有关吗

我要测试什么才能找到零?exp==0,尾数==0? 这个标志和它有关吗

我要测试什么才能找到NAN? 既然我只是个初学者,有人能尽可能简单地解释一下吗! 我还需要戴口罩吗

  • 我是否有一个完成我想要的事情的顺序
这就是我目前所拥有的

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int HexNumber;

    printf("IEEE- 754 \n");
    int a = 0x12345678;
    unsigned char *c = (unsigned char*)(&a);

    if (*c == 0x78) {
      printf("\nlittle-endian\n");
    } else {
      printf("\nbig-endian\n");
    }

    printf("\n>");
    scanf("%x", &HexNumber);
    printf("\n%#x",HexNumber);

    bool negative = !!(HexNumber & 0x80000000);
    int exponent = (HexNumber & 0x7f800000) >> 23;
    int mantissa = (HexNumber & 0x007FFFFF);

    printf("\nsignBit %d,", negative);
    printf("expbits %d,", exponent);
    printf("fractbits %#x,", mantissa);

    return 0;
}

如果您使用的是c99,请尝试函数
fpclassify
,该函数将返回一个枚举,说明值是否为NAN、Infinity等,以及
frexp
,该函数将为您分割值

如果你想自己滚,记住无穷大和零都是有符号的。NaN由指数中的特定位模式定义,我相信尾数以非标准方式提供额外信息

通过阅读:

  • 如果指数为零,尾数为非零,则该值为非规范值

  • 如果指数为零,尾数为零,则值为(+/-)零

  • 如果指数为最大值,尾数为零,则值为(+/-)无穷大

  • 如果指数为最大值,尾数为非零,则值为NAN


如果使用c99,请尝试函数
fpclassify
,该函数将返回一个枚举,说明值是否为NAN、无穷大等,以及
frexp
,该函数将为您分割值

如果你想自己滚,记住无穷大和零都是有符号的。NaN由指数中的特定位模式定义,我相信尾数以非标准方式提供额外信息

通过阅读:

  • 如果指数为零,尾数为非零,则该值为非规范值

  • 如果指数为零,尾数为零,则值为(+/-)零

  • 如果指数为最大值,尾数为零,则值为(+/-)无穷大

  • 如果指数为最大值,尾数为非零,则值为NAN


    • 为什么不亲自验证呢

      #include <stdio.h>
      
      void extract (float x) {
          union {
              float value;
              struct {
                  unsigned int frac : 23;
                  unsigned int exp  : 8;
                  unsigned int sign : 1;
              } fields;
          } conv;
          conv.value = x;
          printf ("Value = %.3g,\tSign = %x,\tExp = %x,\tFrac = %x\n", x, conv.fields.sign, conv.fields.exp, conv.fields.frac);
      }
      
      int main() {
          extract (1.0f);     // normal number
          extract (1.0f/3.0f);    // normal number
          extract (0.0f);     // 0
          extract (-0.0f);    // -0
          extract (1.0f / 0.0f);  // inf
          extract (-1.0f / 0.0f); // -inf
          extract (0.0f / 0.0f);  // nan
          extract (1.e-40f);  // denormal
          extract (-1.e-42f); // denormal
          return 0;
      }
      
      观察:

      • 如果
        exp
        =0xff,则为±inf或nan
        • 如果
          frac
          =0,则为inf(+或-)
        • 如果
          frac
          ≠ 0,它是nan(符号位不重要)
      • 如果
        exp
        =0,则为零或非规范
        • 如果
          frac
          =0,则为零(+或-)
        • 如果
          frac
          ≠ 0,它是非规范(+或-)


      如果您使用的是C,那么在
      中已经有
      isnan
      isnf
      /
      isfinite
      isnormal
      signbit
      用于这些测试。

      为什么不亲自验证呢

      #include <stdio.h>
      
      void extract (float x) {
          union {
              float value;
              struct {
                  unsigned int frac : 23;
                  unsigned int exp  : 8;
                  unsigned int sign : 1;
              } fields;
          } conv;
          conv.value = x;
          printf ("Value = %.3g,\tSign = %x,\tExp = %x,\tFrac = %x\n", x, conv.fields.sign, conv.fields.exp, conv.fields.frac);
      }
      
      int main() {
          extract (1.0f);     // normal number
          extract (1.0f/3.0f);    // normal number
          extract (0.0f);     // 0
          extract (-0.0f);    // -0
          extract (1.0f / 0.0f);  // inf
          extract (-1.0f / 0.0f); // -inf
          extract (0.0f / 0.0f);  // nan
          extract (1.e-40f);  // denormal
          extract (-1.e-42f); // denormal
          return 0;
      }
      
      观察:

      • 如果
        exp
        =0xff,则为±inf或nan
        • 如果
          frac
          =0,则为inf(+或-)
        • 如果
          frac
          ≠ 0,它是nan(符号位不重要)
      • 如果
        exp
        =0,则为零或非规范
        • 如果
          frac
          =0,则为零(+或-)
        • 如果
          frac
          ≠ 0,它是非规范(+或-)


      如果您使用的是C,那么在这些测试中已经有了
      isnan
      isinf
      isnormal
      signbit
      中的
      isnan
      isfinite
      isnormal
      math
      (C99草稿,F.3)中的宏

      与数字分类宏(
      FP_NAN
      FP_INFINITE
      FP_NORMAL
      FP_SUBNORMAL
      FP_ZERO
      )一起使用的
      signbit
      宏和
      FP_classification>宏,提供IEC 60559附录中建议的类功能设施(7.12.3中定义的分类宏不区分信令和静音NAN除外)

      为了自己实现这些测试,您可以使用如下内容(对浮点值有效,从glibc源代码获取和修改):

      int my\u fpclassify(uint32\u t x)
      {
      x&=0x7fffffff;
      如果(x==0)
      /*零*/
      否则如果(x<0x800000)
      /*次正常*/
      否则如果(x>0x7f800000)
      /*楠*/
      else if(x==0x7f800000)
      /*inf*/
      其他的
      /*正常的*/
      }
      输入我的符号位(uint32\u t x)
      {
      返回x&0x8000000;
      }
      
      在C99中,可以使用
      math.h
      中的
      fpclassify()
      signbit()
      宏(C99草稿,F.3):

      与数字分类宏(
      FP_NAN
      FP_INFINITE
      FP_NORMAL
      FP_SUBNORMAL
      FP_ZERO
      )一起使用的
      signbit
      宏和
      FP_classification>宏,提供IEC 60559附录中建议的类功能设施(7.12.3中定义的分类宏不区分信令和静音NAN除外)

      为了自己实现这些测试,您可以使用如下内容(对浮点值有效,从glibc源代码获取和修改):

      int my\u fpclas
      
      Value = 1,  Sign = 0,   Exp = 7f,   Frac = 0
      Value = 0.333,  Sign = 0,   Exp = 7d,   Frac = 2aaaab
      Value = 0,  Sign = 0,   Exp = 0,    Frac = 0
      Value = -0, Sign = 1,   Exp = 0,    Frac = 0
      Value = inf,    Sign = 0,   Exp = ff,   Frac = 0
      Value = -inf,   Sign = 1,   Exp = ff,   Frac = 0
      Value = nan,    Sign = 0,   Exp = ff,   Frac = 400000
      Value = 1e-40,  Sign = 0,   Exp = 0,    Frac = 116c2
      Value = -1e-40, Sign = 1,   Exp = 0,    Frac = 116c2
      
      int my_fpclassify(uint32_t x)
      {
          x &= 0x7fffffff;
          if (x == 0)
              /* zero */
          else if (x < 0x800000)
              /* subnormal */
          else if (x > 0x7f800000)
              /* nan */
          else if (x == 0x7f800000)
              /* inf */
          else
              /* normal */
      }
      
      int my_signbit(uint32_t x)
      {
          return x & 0x80000000;
      }